On 3/7/2013 1:00 PM, Igor R wrote:
It's because the compiler threats Bla(id); as: Bla id; as you can see from the errors (MSVC10): error C2371: 'id' : redefinition; different basic types error C2512: 'Bla' : no appropriate default constructor available
Yes but which (obscure) c++ rule allows this. My day to day c++ knowledge says that () is only used for macro invocations, function declarations, function call's and cast operators and none of them seems to be applicable here.
I belive this falls under the paragraph 6.8: "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."
While paragraph 5.1 (5) says: "A parenthesized expression is a primary expression whose type and value are identical to those of the enclosed expression. The presence of parentheses does not affect whether the expression is an lvalue. The parenthesized expression can be used in exactly the same contexts as those where the enclosed expression can be used, and with the same meaning, except as otherwise indicated."
Try the following :)
int (main()) { }
a thx. The standard wording is too cryptic for me but there is an explanation. I should switch to c# :).