我知道下面写的代码是非法的
void doSomething(std::string *s){}
int main()
{
doSomething(&std::string("Hello World"));
return 0;
}
原因是我们不允许获取临时对象的地址。但我的问题是WHY?
让我们考虑下面的代码
class empty{};
int main()
{
empty x = empty(); //most compilers would elide the temporary
return 0;
}
接受的答案here https://stackoverflow.com/questions/4286301/why-isnt-the-copy-constructor-called-here/4286330#4286330提及
“通常编译器将临时对象和副本视为位于内存完全相同位置的两个对象,并避免复制。”
根据该声明,可以得出结论,临时文件存在于某个内存位置(因此可以获取其地址),并且编译器决定通过在临时文件所在的同一位置创建就地对象来消除临时文件。
这是否与不能获取临时地址的事实相矛盾?
我也想知道返回值优化是如何实现的。有人可以提供与 RVO 实施相关的链接或文章吗?
&std::string("Hello World")
问题不在于这个std::string("Hello World")
产生一个临时对象。问题在于表达式std::string("Hello World")
是引用临时对象的右值表达式。
您无法获取右值的地址,因为并非所有右值都有地址(并且并非所有右值都是对象)。考虑以下:
42
这是一个整数文字,它是一个主表达式和一个右值。它不是一个对象,并且(可能)没有地址。&42
毫无意义。
是的,右值可以引用一个对象,就像第一个示例中的情况一样。问题是并非所有右值都引用对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)