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
имеет НРВО?
Правильный. Именованное разрешение никогда не применяется к параметрам функции; это относится только к локальным переменным, которые не являются параметрами функции.