Я знаю, что код, написанный ниже, является недопустимым
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?