其他分享
首页 > 其他分享> > c – 为什么通用参考和右值参考流的差异

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