Посмотрите на этот код:
#include <stdio.h>
struct Foo {
Foo() { }
Foo(const Foo &) { printf("copy\n"); }
Foo(Foo &&) { printf("move\n"); }
};
Foo getFoo() {
Foo f;
return *&f;
}
int main() {
getFoo();
}
С++ 14 Standard говорит (12.8/31), что разрешено копирование/перемещение:
в операторе return в функции с возвращаемым типом класса, когда выражение - это название энергонезависимого автоматического объекта (кроме параметр функции или catch-clause) с тем же cv-unquali fiified тип как возвращаемый тип функции, операция копирования/перемещения может быть опущено путем создания автоматического объекта непосредственно в функция возвращает значение
В моем примере выражение return не является именем, поэтому я не думаю, что разрешение разрешено.
Я проверил GCC/clang/MSVC, и пока clang/MSVC не выдаёт копию, GCC делает. Здесь GCC нарушает стандарт?