Dzisiaj wykryłem że guaranted copy elision nie do końca działa (czyli że możesz nie mieć copy,move ctora a i tak będziesz miał return value optimalization).
W C++14 zgodnie z oczekiwaniami to się nie kompiluje, natomiast kompiluje się w C++17:
#include <stdio.h>
#include <iostream>
class Base{
public:
Base()
{
std::cout << "Base ctor" << std::endl;
}
Base(const Base& base)
{
std::cout << "Base copy ctor" << std::endl;
}
Base(Base&& base) = delete;
//Base(Base&& base)
//{
// std::cout << "Base move ctor" << std::endl;
//}
};
/*Base fun()
{
Base b;
return b;
}*/
Base fun2()
{
return Base();
}
int main()
{
Base b = fun2();
return 0;
}
To spoko. Na razie wszystko się zgadza. Ale jak odkomentujesz fun() i użyjesz:
Base b = fun();
to też powinno być podobnie w C++14 nie kompiluje się a w C++17 kompiluje. Ale niespodzianka, w C++17,20,23 to się nie kompiluje. Czyli quaranted copy elision działa w ograniczonym zakresie tylko dla Return Value Optimalization ale nie już dla Named Return Value Optimalization i tak to trzeba zapamiętać???
