Здравствуйте, T4r4sB, Вы писали:
TB>Вот тут тоже убери двойной амперсанд. В переменной значение же? Значит так и пиши в объявлении
Ну смотрите, получается что обычный возврат return из функции — может порождать копию. Так ведь?
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
return _trackedClass; // <- тут копия порождается.
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take();
return t;
}
Однако если срабатывает некая оптимизация, то копия уже не порождается. К примеру тут:
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
TrackedClass tc = std::move(_trackedClass); // <- Копия не порождается.
return tc;
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take(); // <- копия НЕ порождается.
return t;
}
int main(int argc, const char * argv[]) {
TrackedClass t = fun1();
t.test();
std::cout << "test" << std::endl;
}
Правильно ли я понял, что это благодаря умному компилятору и NRVO ? И всегда ли можно на это рассчитывать, всегда ли имеем 100% гарантию что копия не порождается?