使用高效的现代C++,第25项。我们有一个例子
案例1
class Widget {
public:
template<typename T>
void setName(T&& newName)
{ name = std::forward<T>(newName); }
...
};
案例2
class Widget {
public:
void setName(const std::string& newName)
{ name = newName; }
void setName(std::string&& newName)
{ name = std::move(newName); }
...
};
电话
Widget w;
w.setName("Adela Novak");
现在假设情况1,本书声明文字将传递给w的name数据成员中的t std::string的赋值运算符。
假设案例2,本书指出->首先,从文本创建一个临时对象,调用字符串构造函数,以便setName参数可以绑定到它,然后将该临时对象移动到w的name数据成员中。
问题
为什么会出现这种行为上的差异?我该怎么想呢?
也就是说,为什么在案例1中不需要临时的?为什么会有差异?是T&&不推断为字符串的右值引用,从而得出与案例2相同的行为(根据本书,显然不是,但为什么)?