Reference a temporary in msvc

前端 未结 2 582
耶瑟儿~
耶瑟儿~ 2020-12-04 04:07

Why does this compile on MS Visual C++?

struct myClass{};

void func(myClass& arg){}

void main() {
   func( myClass() );  // works even though func only         


        
相关标签:
2条回答
  • 2020-12-04 04:26

    MSVC 2017 with default project settings (that now include /permissive- flag) yields an error:

    error C2664: 'void func(myClass &)': cannot convert argument 1 from 'myClass' to 'myClass &'
    note: A non-const reference may only be bound to an lvalue

    Even if /permissive- option is not viable for some reason using /W4 will yield a warning:

    warning C4239: nonstandard extension used: 'argument': conversion from 'myClass' to 'myClass &'
    note: A non-const reference may only be bound to an lvalue

    0 讨论(0)
  • 2020-12-04 04:37

    It compiles because MSVC has a non-standard compliant "extension" that allows binding non-const references to temporaries.

    The first example should not compile on a standards compliant compiler.

    In the second example, you are taking the address of a temporary to set the value of a pointer. This should also result in an error.

    Clang 3.2 produces:

    error: taking the address of a temporary object of type 'Foo' [-Waddress-of-temporary]

    while GCC 4.7.3 produces

    error: taking address of temporary [-fpermissive]

    0 讨论(0)
提交回复
热议问题