C++ RVO: when it happens?

C++ RVO: when it happens?

本文关键字:happens it when RVO C++      更新时间:2023-10-16

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?

函数f(x a)的最后一行是否有任何区别:返回a;而不是返回std ::移动(a);?

否。a是该函数的局部变量,因此return a可以从中移动。

函数f没有RVO是真的,但是g具有NRVO?

正确。命名Elision永远不会适用于函数参数;它仅适用于不是函数参数的本地变量。