在 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 中引用一个临时的的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ASP.NET 试图为 Web 服务引用生成一个临时类?

防止临时对象文件在 MSVC 中撞击磁盘

临时变量不能作为非const引用

为啥在通过 const 引用传递临时值时调用复制构造函数?

对临时声明的右值引用

如何评价 C++11 的右值引用(Rvalue reference)特性?