我知道下面写的代码是非法的
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 实现相关的链接或文章吗?
最佳答案
&std::string("Hello World")
问题不在于 std::string("Hello World")
产生一个临时对象。问题是表达式 std::string("Hello World")
是一个引用临时对象的右值表达式。
你不能获取右值的地址,因为不是所有的右值都有地址(也不是所有的右值都是对象)。考虑以下几点:
42
这是一个整数文字,它是一个主表达式和一个右值。它不是一个对象,它(可能)没有地址。 &42
是无意义的。
是的,右值可以引用一个对象,就像您的第一个示例中的情况一样。问题是并非所有的右值都指向对象。
关于c++ - 为什么占用临时地址是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301179/