【发布时间】:2015-08-01 03:00:10
【问题描述】:
我正在尝试理解 rvalue 引用。我已经看到它们是如何在构造函数中使用的,例如 std::move 和 std::forward,但我仍然不明白为什么这不起作用:
void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
确实如此:
template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
为什么它适用于函数模板版本?
【问题讨论】:
-
后一个版本有效,因为
T被推断为string&。 “当函数参数类型为 T&& 形式时,其中 T 是模板参数,而函数参数是类型 A 的左值,则类型 A& 用于模板参数推导。”如果您希望前者工作,请使用std::move。 -
这是模板推导的一个特例,这里(也只有这里AFAIK),
T可以推导为引用类型。通常在模板类型推导中T只推导为非引用。
标签: c++ c++11 templates rvalue-reference