【发布时间】:2017-08-03 22:42:45
【问题描述】:
http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32
#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};
X f(X a) {
return a;
}
X g(const char * b) {
X c(b);
return c;
}
int main() {
f("hello"); // 13
g("hello"); // 1
}
函数f(X a)最后一行有什么区别:
return a; 而不是 return std::move(a);?
函数f 没有RVO 但g 有NRVO 是真的吗?
【问题讨论】:
-
IIRC,使用
return std::move(a);箔 RVO;真正的 RVO 既不涉及移动也不涉及复制构造函数,但std::move(a)表示需要构造,因为您违反了 NRVO 的规则。 -
Stephan T. Lavavej 在他的“不要帮助编译器”演讲中解释了这一点
-
每个问题一个问题。
标签: c++ c++11 move-semantics rvo nrvo