Search code examples
c++visual-studio-2012most-vexing-parse

Visual Studio C++ compiler weird behaviour


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, but unfortunately I can't test them now.

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    return 0;
}

Solution

  • 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.