获取临时对象的地址

fre*_*low 25 c++ rvalue

§5.3.1一元运算符,第3节

一元&运算符的结果是指向其操作数的指针.操作数应为左值或限定ID.

在这种情况下,"应该"究竟是什么意思?这是否意味着取一个临时的地址是错误的?我只是想知道,因为g ++只给我一个警告,而comeau拒绝编译以下程序:

#include <string>

int main()
{
    &std::string("test");
}
Run Code Online (Sandbox Code Playgroud)

g ++ 警告:taking address of temporary

comeau 错误:expression must be an lvalue or a function designator

有人有微软编译器或其他编译器,可以测试这个程序吗?提前致谢.

AnT*_*AnT 26

标准语言中的"应"一词意味着严格的要求.所以,是的,你的代码格式错误(这是一个错误),因为它试图将address-of运算符应用于非左值.

但是,这里的问题不是试图解决临时问题.问题是,再次采用非左值的地址.临时对象可以是左值或非左值,具体取决于生成临时对象的表达式或提供对该临时对象的访问权限.在你的情况下,你有std::string("test")- 一个非参考类型的功能样式,根据定义,它产生一个非左值.因此错误.

例如,如果您希望获取临时对象的地址,则可以通过执行此操作来解决限制问题

const std::string &r = std::string("test");
&r; // this expression produces address of a temporary
Run Code Online (Sandbox Code Playgroud)

只要临时存在,结果指针保持有效.还有其他方法可以合法获取临时对象的地址.只是你的具体方法恰好是非法的.

  • +1为rvalue和临时的差异.人们经常使他们平等,但他们根本不是.一个常见的例子是异常对象,它们是左值,可以绑定到catch子句中的`T&`. (5认同)

小智 5

当在C++标准中使用"应该"这个词时,它意味着"必须在死亡的痛苦中" - 如果一个实现不遵守这个,它就是错误的.

  • 我不明白为什么.如果您认为答案不正确,那么无论您是否自己撰写答案,都应该低估.我认为我们已经足够成熟,可以解决这个问题,不是吗?或者人们真的认真对待那场比赛? (8认同)
  • @MSalters和BTW,我一直认为这是一个可疑的做法,对你自己提供答案的问题进行回答. (3认同)
  • @MSalters必须对死亡的痛苦发出诊断. (2认同)