在有效的现代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的重载版本,[...]


文字说,除了引用的代码外,其他代码中不会出现任何临时字符串对象。您严重地误读了文本,从而导致引用错误。

10-08 06:14