Lea*_*rer 3 c++ rvalue-reference forwarding-reference
使用Efficient Modern C++,第25项.我们有一个例子
class Widget {
public:
template<typename T>
void setName(T&& newName)
{ name = std::forward<T>(newName); }
...
};
Run Code Online (Sandbox Code Playgroud)
class Widget {
public:
void setName(const std::string& newName)
{ name = newName; }
void setName(std::string&& newName)
{ name = std::move(newName); }
...
};
Run Code Online (Sandbox Code Playgroud)
Widget w;
w.setName("Adela Novak");
Run Code Online (Sandbox Code Playgroud)
现在假设情况1,该书指出文字被传递给w的名称数据成员中的t std :: string的赋值运算符.
假设情况2,本书指出 - >首先从文字创建临时,调用字符串构造函数,因此setName参数可以绑定到它,并且将此临时文件移动到w的名称数据成员中.
为什么这种行为上的差异会产生,我该怎么想呢?
也就是说,为什么在案例1中不需要临时的?为什么会有区别?T &&是否被推断为对字符串的右值引用,因此得出与案例2相同的行为(显然不是,根据本书,但为什么)?
在案例1中,T推断为const char (&)[12],而不是std::string.编译器没有理由提升字符串文字std::string.在第2种情况中,每个重载都需要引用a std::string,这会强制创建一个临时std::string引用,使用隐式const char*构造函数可以绑定引用.
请注意,虽然rvalue引用(例如std::string &&可能仅绑定到rvalue),但模板化等效项T &&可能会绑定到rvalues和lvalues.