Почему использование временного адреса является недопустимым?

Я знаю, что приведенный ниже код является недопустимым

void doSomething(std::string *s){}
int main()
{
     doSomething(&std::string("Hello World"));
     return 0;
}

Причина в том, что нам не разрешено принимать адрес временного объекта. Но мой вопрос: ПОЧЕМУ?

Давайте рассмотрим следующий код

class empty{};
int main()
{
      empty x = empty(); //most compilers would elide the temporary
      return 0;
}

В принятом ответе здесь упоминается

«обычно компилятор рассматривает временный объект и его копию как два объекта, которые расположены в одном и том же месте памяти и избегают копирования ».

Согласно заявлению, можно сделать вывод, что временный объект присутствовал в некоторой области памяти (следовательно, его адрес мог быть взят), и компилятор решил исключить временный, создав объект на месте в том же месте, где находился временный.

Противоречит ли это тому, что адрес временного объекта не может быть взят?

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

14
задан Community 23 May 2017 в 12:25
поделиться