在msvc中引用临时文件

时间:2013-05-15 16:43:38

标签: c++ visual-c++

为什么要在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() ); 
}

这仅适用于使用构造函数临时创建的对象。这不适用于任何其他rvalue,例如(myClass()+ myClass())..

2 个答案:

答案 0 :(得分:6)

它编译是因为MSVC具有非标准兼容的“扩展”,允许将非const引用绑定到临时值。

第一个示例不应在符合标准的编译器上编译。

在第二个示例中,您将获取临时地址以设置指针的值。这也应该导致错误。

Clang 3.2产生:

  

错误:获取'Foo'类型的临时对象的地址[-Waddress-of-temporary]

而GCC 4.7.3产生

  

错误:获取临时[-fpermissive]

的地址

答案 1 :(得分:0)

具有默认项目设置(现在包括/permissive-标志)的MSVC 2017:yields an error

  

错误C2664:'void func(myClass&)':无法将参数1从'myClass'转换为'myClass&'
  注意:非常量引用只能绑定到左值

即使由于某些原因/permissive-选项不可行,使用/W4也会产生警告:

  

警告C4239:使用了非标准扩展名:“参数”:从“ myClass”转换为“ myClass&”
  注意:非常量引用只能绑定到左值