При возврате локального объекта по значению компиляторы С++ могут оптимизировать ненужные копии (копировать elision), используя семантику перемещения.
" может оптимизировать" подразумевает, что если надлежащие условия не выполняются, поведение должно возвращаться к семантике возврата по значениям по умолчанию на основе копии.
Таким образом, как я понимаю, всегда верна копируемый объект по значению.
Но компиляторы (clang и gcc), похоже, не согласны с моей интерпретацией, как показано ниже MWE.
class Foo {
public:
Foo();
Foo(const Foo&);
Foo(Foo&&) = delete;
}
Foo f() { return Foo(); } // error: call to explicitly deleted constructor of 'Foo'
Foo g() { Foo a; return a; } // gcc complains, clang is fine
Foo x = g(); // error: call to explicitly deleted constructor of 'A'
Q1: Требуется ли возврат по значению объекта для перемещения?
Q2: Если нет, делайте gcc и clang misbehave на моем MWE или я пропущу что-то еще?