从 Efficient Modern 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 相同的行为(显然不是,根据书,但为什么)?