代码之家  ›  专栏  ›  技术社区  ›  yar

自动引用本征对象不是用GCC编译,而是用MSVC编译[duplicate]

  •  0
  • yar  · 技术社区  · 6 年前

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

    0 回复  |  直到 12 年前
        1
  •  7
  •   juanchopanza    12 年前

    它之所以编译,是因为MSVC有一个非标准兼容的“扩展”,允许将非常量引用绑定到临时表。

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

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

    错误:获取临时[-fpermissive]的地址

        2
  •  0
  •   user7860670    6 年前

    MSVC 2017默认项目设置(现在包括 /permissive- 旗帜) yields an error :

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

    /允许的- 由于某些原因,使用 /W4


    注意:非常数引用只能绑定到左值