为什么有些编译器抱怨从构造函数中获取临时地址而有些不?
例如:
WriteLine(&String8("Exception"));
Run Code Online (Sandbox Code Playgroud)
我假设抱怨编译器没有将该地址存储在堆栈中,如果我忽略该警告,它将会爆炸.有没有办法让它在一条线上工作?是返回地址的类的静态方法的最佳/唯一方法吗?嗯我不认为String8类上返回指针的静态方法会起作用,因为它会将String8类保存到寄存器然后在WriteLine()中使用它
你给出的示例代码,
WriteLine(&String8("Exception"));
Run Code Online (Sandbox Code Playgroud)
是无效的标准C++,除非String8类型定义的自定义地址运算符.
你问,
"为什么有些编译器会抱怨从构造函数中获取临时地址,而有些编译器却没有?"
一些编译器抱怨,因为C++标准说你不能使用内置地址运算符来获取临时地址:
C++11§5.3.1/ 3:
"一元运算&符的结果是指向其操作数的指针.操作数应为左值或限定id."
一些编译器,如Visual C++,不会抱怨,因为它们提供了将地址作为语言扩展的能力.
请注意,用户定义的类型可以定义自定义地址运算符.因此,在您的情况下,它取决于String8类型.以及编译器.
你进一步问,
"有没有办法让它在一条线上工作?"
是的,您可以定义地址运算符.但这不是一个好主意.首先,它只会产生标准库等问题,其次,对此的需求非常少见.
我只记得一个我认真考虑过这种解决方案的案例,即将COM智能指针作为out-argument传递.我没有定义地址运算符,而是定义了一个命名方法.它更清晰,不会干扰其他事情.
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |