§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)
只要临时存在,结果指针保持有效.还有其他方法可以合法获取临时对象的地址.只是你的具体方法恰好是非法的.
小智 5
当在C++标准中使用"应该"这个词时,它意味着"必须在死亡的痛苦中" - 如果一个实现不遵守这个,它就是错误的.
| 归档时间: |
|
| 查看次数: |
24410 次 |
| 最近记录: |