Ответ 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.