Visual Studio C ++编译器怪异的行为

我只是好奇,知道为什么这个小块的代码在Visual Studio中编译正确(没有警告)。 也许GCC和Clang的结果是一样的,但不幸的是我现在无法testing它们。

struct T { int t; T() : t(0) {} }; int main() { T(i_do_not_exist); return 0; } 

T(i_do_not_exist); 是一个与T i_do_not_exist;具有相同含义的对象声明T i_do_not_exist;

N4567§6.8 [stmt.ambig] p1

涉及expression式语句 s和声明 s的语法存在一个模棱两可的问题:一个具有函数式显式types转换(5.2.3)作为其最左边子expression式的expression式语句可能无法与第一个声明符以一个(在这些情况下, 声明是一个声明

§8.3 [dcl.meaning] p6

D有forms的声明TD

( D1 )

包含的declarator-id的types与声明中包含的declarator-id的types相同

T D1

括号不会改变embedded的声明符id的types,但是它们可以改变复杂声明符的绑定。

因为它定义了一个Ttypes的variables:

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; } 

上面的例子看起来很愚蠢,但是这个语法是有原因的。

一个更好的例子是:

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

可能还有其他的例子可以find。