为什么《Effective Modern C++》第 25 条中说“不会出现临时 std::string 对象”?

foo*_*foo 1 c++ string c++11

在Effective Modern C++的Item 25(170p~171p)中,代码如下:

\n\n
class Widget {\npublic:\nvoid setName(const std::string& newName) // set from\n{ name = newName; } // const lvalue\nvoid setName(std::string&& newName)     // set from\n{ name = std::move(newName); }          // rvalue\n\xe2\x80\xa6\n};\n\nw.setName("Adela Novak");\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

当 setName 的版本采用通用引用时,字符串文字“Adela Novak”将被传递给 setName,在那里它将被传送给 w 内的 std::string 的赋值运算符。因此,w\xe2\x80\x99s\n name 数据成员将直接从字符串\n 文字分配;不会出现临时 std::string 对象

\n
\n\n

我不明白为什么如果调用采用通用引用的 setName 版本, “不会出现临时 std::string 对象”。newName不应该被创建为临时 std::string 吗?

\n

小智 5

代码前面是

template<typename T>
void setName(T&& newName)             // newName is
{ name = std::forward<T>(newName); }  // universal reference
Run Code Online (Sandbox Code Playgroud)

随后出现您复制到问题中的代码。然后,在引用的文字之前:

在这种情况下这当然可行,但也有缺点。[...] 例如,考虑使用setName

w.setName("Adela Novak");
Run Code Online (Sandbox Code Playgroud)

紧接着:

然而,随着 的重载版本setName,[...]

文本说除了您引用的代码之外,在其他代码中不会出现临时字符串对象。您严重误读并因此错误引用了文本。