Допустим, у нас есть следующий код:
std::vector<int> f()
{
std::vector<int> y;
...
return y;
}
std::vector<int> x = ...
x = f();
Кажется, у компилятора есть два подхода:
(a) NRVO: уничтожить x, затем построить f() вместо x.
(b) Переместить: Построить f() в временном пространстве, переместить f() в x, разрушить f().
Может ли компилятор использовать любой из подходов в соответствии со стандартом?