在 msvc 中引用一个临时的
Posted
技术标签:
【中文标题】在 msvc 中引用一个临时的【英文标题】:Reference a temporary in msvc 【发布时间】:2013-05-15 16:43:37 【问题描述】:为什么这会在 MS Visual C++ 上编译?
struct myClass;
void func(myClass& arg)
void main()
func( myClass() ); // works even though func only takes myClass&
// (not const myClass&!!)
这是否也适用于其他编译器,或者此 MSVC 特定(甚至是编译器错误?)。我什至可以像这样获得这个右值的参考:
void func(myClass* arg)
int main()
func( &myClass() );
这仅适用于使用构造函数临时创建的对象。这不适用于任何其他右值,例如 (myClass() + myClass())..
【问题讨论】:
这是 imo 中最邪恶的扩展。 【参考方案1】:它可以编译是因为 MSVC 有一个不符合标准的“扩展”,它允许将非常量引用绑定到临时对象。
第一个示例不应在符合标准的编译器上编译。
在第二个示例中,您使用临时地址来设置指针的值。这也应该导致错误。
Clang 3.2 产生:
错误:获取“Foo”类型的临时对象的地址 [-Waddress-of-temporary]
当 GCC 4.7.3 产生时
错误:获取临时地址 [-fpermissive]
【讨论】:
"你是拿一个临时地址来设置一个指针的值。这是允许的" 是吗?我不这么认为。 5.3.1[expr.unary.op]/3:操作数应该是一个左值或一个合格的id,但它们都不是临时的。它应该被编译器拒绝。 @DavidRodríguez-dribeas 好点,谢谢。我被旧版本的 GCC 愚弄了。【参考方案2】:具有默认项目设置的 MSVC 2017(现在包括 /permissive-
标志)yields an error:
错误 C2664:“void func(myClass &)”:无法将参数 1 从“myClass”转换为“myClass &” 注意:非常量引用只能绑定到左值
即使/permissive-
选项由于某种原因不可行,使用/W4
也会产生警告:
警告 C4239:使用了非标准扩展:“参数”:从“myClass”转换为“myClass &” 注意:非常量引用只能绑定到左值
【讨论】:
以上是关于在 msvc 中引用一个临时的的主要内容,如果未能解决你的问题,请参考以下文章