Я знаю, что код, написанный ниже, является незаконным
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;
}
В принятом ответе here упоминается
"обычно компилятор рассматривает временную и копию, сконструированную как два объекта, которые расположены в одном и том же месте памяти и избегают копирования."
В соответствии с утверждением можно сделать вывод о том, что временное существовало в некоторой ячейке памяти (следовательно, его адрес мог быть взят), и компилятор решил исключить временный объект, создав объект на месте в том же месте, где временно присутствовал.
Это противоречит тому, что адрес временного не может быть принят?
Я также хотел бы знать, как реализована оптимизация возвращаемого значения. Может ли кто-нибудь предоставить ссылку или статью, связанную с реализацией RVO?