Visual Studio C++ compiler weird behaviour

后端 未结 2 492
我在风中等你
我在风中等你 2020-12-14 15:07

I\'m just curious to know why this small piece of code compiles correctly (and without warnings) in Visual Studio. Maybe the result is the same with GCC and Clang,

相关标签:
2条回答
  • 2020-12-14 15:16

    T(i_do_not_exist); is an object declaration with the same meaning as T i_do_not_exist;.

    N4567 § 6.8[stmt.ambig]p1

    There is an ambiguity in the grammar involving expression-statements and declarations: An expression-statement with a function-style explicit type conversion (5.2.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.

    § 8.3[dcl.meaning]p6

    In a declaration T D where D has the form

    ( D1 )

    the type of the contained declarator-id is the same as that of the contained declarator-id in the declaration

    T D1

    Parentheses do not alter the type of the embedded declarator-id, but they can alter the binding of complex declarators.

    0 讨论(0)
  • 2020-12-14 15:35

    Because it defines a variable of type T:

    http://coliru.stacked-crooked.com/a/d420870b1a6490d7

    #include <iostream>
    
    struct T {
        int t;
        T() : t(0) {}
    };
    
    int main() {
        T(i_do_not_exist);
        i_do_not_exist.t = 120;
        std::cout << i_do_not_exist.t;
        return 0;
    }
    

    The above example looks silly, but this syntax is allowed for a reason.

    A better example is:

    int func1();
    namespace A
    {
       void func1(int);
       struct X {
           friend int (::func1)();
       };
    }
    

    Probably other examples could be found.

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