Я знаю, что код, написанный ниже, незаконен
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?
&(std::string()=std::string("Hello World"));
- person curiousguy   schedule 03.12.2011