在有效的现代C ++的第25(170p〜171p)条中,代码如下所示:
class Widget {
public:
void setName(const std::string& newName) // set from
{ name = newName; } // const lvalue
void setName(std::string&& newName) // set from
{ name = std::move(newName); } // rvalue
…
};
w.setName("Adela Novak");
在setName版本采用通用引用的情况下,字符串
文字“ Adela Novak”将传递给setName,在此处
传递给w中std :: string的赋值运算符。 w的
因此,将直接从字符串中分配名称数据成员
文字;不会出现临时的std :: string对象。
我不明白,如果调用带有通用引用的setName版本,为什么“不会出现临时std :: string对象”。不应将newName创建为临时std :: string吗?
最佳答案
该代码之前
template<typename T>
void setName(T&& newName) // newName is
{ name = std::forward<T>(newName); } // universal reference
后来出现了您复制到问题中的代码。然后,在引文之前:
在这种情况下,那当然可以工作,但是有缺点。 [...]例如,考虑使用
setName
:w.setName("Adela Novak");
然后立即:
但是,使用
setName
的重载版本,[...]文字说,除了引用的代码外,其他代码中不会出现任何临时字符串对象。您严重地误读了文本,从而导致引用错误。