Этот вопрос находится в другом аспекте (также ограничен gcc). Мой вопрос предназначен только для безымянных объектов . Оптимизация возвращаемого значения позволяет изменять наблюдаемое поведение результирующей программы. Кажется, это тоже упоминается в стандарте.
Однако этот термин «разрешено» сбивает с толку. Означает ли это, что RVO гарантированно будет выполняться на каждом компиляторе. Из-за того, что приведенный ниже код RVO изменяет свое наблюдаемое поведение:
#include
int global = 0;
struct A {
A(int *p) {}
A(const A &obj) { ++ global; }
};
A foo () { return A(0); } // <--- RVO happens
int main () {
A obj = foo();
std::cout<<"global = "<
Предполагается ли, что эта программа печатает global = 0
для всех реализаций, независимо от оптимизаций компилятора и размера метода foo
?