【发布时间】:2020-05-28 09:34:15
【问题描述】:
#include <string>
std::string f()
{
std::string s;
return std::move(s);
}
int main()
{
f();
}
g++ -Wall z.cpp 给出警告如下:
z.cpp: In function ‘std::string f()’:
z.cpp:6:21: warning: moving a local object in a return statement prevents copy elision [-Wpessimizing-move]
6 | return std::move(s);
| ~~~~~~~~~^~~
z.cpp:6:21: note: remove ‘std::move’ call
我知道如果我将return std::move(s); 更改为return s;,将避免警告。但是,根据C++ standard,NRVO,说在这种情况下,是不能保证的。如果我写return s;,我不确定NRVO是否会被执行。
如何缓解不确定感?
【问题讨论】:
-
在这种情况下,复制省略怎么办?
-
本例不保证复制省略。
-
您可以'return s',让编译器生成列表,然后读取它以查看编译器是否复制省略。如果没有,您可以将函数更改为 'void f(std::string& s)'
标签: c++ performance c++17 standards nrvo