【发布时间】:2020-09-17 17:39:06
【问题描述】:
当我们从 C++ 函数返回一个值时,复制初始化就会发生。例如:
std::string hello() {
std::string x = "Hello world";
return x; // copy-init
}
假设 RVO 已禁用。
根据复制初始化规则,如果x 是非 POD 类类型,则应调用复制构造函数。但是对于 C++11 以后的版本,我看到调用了 move-constructor。我无法找到或理解有关此https://en.cppreference.com/w/cpp/language/copy_initialization 的规则。所以我的第一个问题是 -
C++ 标准对从函数返回值时复制初始化发生的移动有何规定?
作为上述问题的扩展,我还想知道在什么情况下不会发生移动。我想出了以下情况,其中调用了复制构造函数而不是移动:
std::string hello2(std::string& param) {
return param;
}
最后,在一些库代码中,我看到std::move 在返回时被显式使用(即使 RVO 或 move 应该发生)。例如:
std::string hello3() {
std::string x = "Hello world";
return std::move(x);
}
- 返回时显式使用
std::move有什么好处和坏处?
【问题讨论】:
-
在这种情况下查找“NRVO”
-
这能回答你的问题吗:stackoverflow.com/questions/12953127/…
-
这里的关键缺失点是C++11中return语句的语义
标签: c++11 initialization move copy-constructor rvo