C++ RVO: когда это произойдет?

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 имеет НРВО?

1 ответ

Решение

Есть ли разница в последней строке функции f(X a): return a; вместо возврата std::move(a);?

Нет. a является локальной переменной функции, поэтому return a может двигаться от этого.

Это правда, что функция f не имеет RVO, но g имеет НРВО?

Правильный. Именованное разрешение никогда не применяется к параметрам функции; это относится только к локальным переменным, которые не являются параметрами функции.

Другие вопросы по тегам