我正试图理解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
。 - Peter HueneT
可以被推导为引用类型。通常在模板类型推导中,T
仅被推导为非引用类型。 - M.M