Возвращается ли объект из функции, которая все еще создана, когда она не используется?

Рассмотрим следующий код. Что происходит при вызове doStuff(), но возвращаемое значение не используется? Создан ли SomeClass? Разумеется, само создание может иметь важные побочные эффекты, но поэтому они могут копировать-конструкторы, и они по-прежнему не указаны в RVO/copy-elision.

SomeClass doStuff(){
    //...do stuff
    return SomeClass( /**/);
}

SomeClass some_object = doStuff();
doStuff(); //What happens here?

(Edit: проверено это с помощью GCC -O3. Объект построен, а затем сразу же разрушен)

Ответы

Ответ 1

Я чувствую там недоразумение, когда речь заходит о RVO и копировании элиции. Это не означает, что возвращаемое значение функции не создается. Он всегда создавал, что не может быть реализована реализация.

Единственная свобода, когда дело доходит до выдающихся копий, несмотря на побочные эффекты, - это сокращение среднего человека. Когда вы инициализируете объект с результатом вызова, стандарт позволяет подключить целевой объект, чтобы функция инициализировалась напрямую.

Если вы не предоставляете целевой объект (используя результат), то временное должно быть материализовано и уничтожено как часть полного выражения, содержащего вызов функции.

Поэтому немного поиграем с вашим примером:

doStuff(); // An object is created and destroyed as part of temporary materialization
           // Depending on the compilers analysis under the as-if rule, there may be
           // further optimization which gets rid of it all. But there is an object there 
           // formally.

std::rand() && (doStuff(), std::rand());
// Depending on the result of std::rand(), this may or may not create an object.
// If the left sub-expression evaluates to a falsy value, no result object is materialized.
// Otherwise, one is materialized before the second call to std::rand() and 
// destroyed after it.

Ответ 2

В некоторых случаях компилятор может избежать ненужной копии, даже если он имеет побочные эффекты, да.

Компилятор не может исключить существование всего объекта, если он имеет побочные эффекты.

Если у него нет побочных эффектов, то результат не будет наблюдаемым, поэтому независимо от того, произошло ли это существование или нет, вопрос не является вопросом.

tl; dr: в стандарте перечислены очень специфические возможности выбора, и это не один из них.