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