Является ли RVO (оптимизация возвращаемого значения) для безымянных объектов универсально гарантированным поведением?

Этот вопрос находится в другом аспекте (также ограничен 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 ?

5
задан Community 23 May 2017 в 10:08
поделиться