c – 为什么通用参考和右值参考流的差异
作者:互联网
根据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的名称数据成员中的t std :: string的赋值运算符.
假设案例2,该书指出 – >首先从文字中创建一个临时文件,调用字符串构造函数,因此setName参数可以绑定到它,并将此临时文件移动到w的名称数据成员中.
题
为什么这种行为上的差异会产生,我该怎么想呢?
也就是说,为什么在案例1中不需要临时的?为什么会有区别?是T&&不推测是对字符串的右值引用,因此得出与案例2相同的行为(显然不是,根据书,但为什么)?
解决方法:
在情况1中,T被推断为const char(&)[12],而不是std :: string.编译器没有理由将字符串文字提升为std :: string.在第2种情况下,每个重载都需要引用一个std :: string,它强制创建一个临时的std :: string,可以使用隐式的const char *构造函数将引用绑定到该字符串.
请注意,虽然rvalue引用如std :: string&&可能只能绑定一个右值,模板化的等价T&&可以绑定rvalues和lvalues.
标签:forwarding-reference,c,rvalue-reference 来源: https://codeday.me/bug/20190724/1521951.html