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。