在Effective Modern C++的Item 25(170p~171p)中,代码如下:
\n\nclass 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");\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n当 setName 的版本采用通用引用时,字符串文字“Adela Novak”将被传递给 setName,在那里它将被传送给 w 内的 std::string 的赋值运算符。因此,w\xe2\x80\x99s\n name 数据成员将直接从字符串\n 文字分配;不会出现临时 std::string 对象。
\n
我不明白为什么如果调用采用通用引用的 setName 版本, “不会出现临时 std::string 对象”。newName不应该被创建为临时 std::string 吗?
\n小智 5
代码前面是
Run Code Online (Sandbox Code Playgroud)template<typename T> void setName(T&& newName) // newName is { name = std::forward<T>(newName); } // universal reference
随后出现您复制到问题中的代码。然后,在引用的文字之前:
在这种情况下这当然可行,但也有缺点。[...] 例如,考虑使用
setName:Run Code Online (Sandbox Code Playgroud)w.setName("Adela Novak");
紧接着:
然而,随着 的重载版本
setName,[...]
文本说除了您引用的代码之外,在其他代码中不会出现临时字符串对象。您严重误读并因此错误引用了文本。
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |