C++ RVO:什么时候发生?

C++ RVO: when it happens?

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 是真的吗?

Is there any difference in the last line of function f(X a): return a; instead of return std::move(a);?

没有。 a 是函数的局部变量,所以 return a 可以从它移动。

Is it true that function f doesn't have RVO but g has NRVO?

正确。命名省略从不应用于函数参数;它仅适用于不是函数参数的局部变量。