我知道下面写的代码是非法的
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 实施相关的链接或文章吗?