赞
踩
我只是想知道为什么这小段代码在Visual Studio中正确编译(并且没有警告).也许结果与GCC和Clang相同,但不幸的是我现在无法测试它们.
struct T { int t; T() : t(0) {} }; int main() { T(i_do_not_exist); return 0; }
cpplearner.. 43
T(i_do_not_exist);
是一个具有相同含义的对象声明T i_do_not_exist;
.
N4567§6.8[stmt.ambig] p1
语法中涉及表达式语句和声明 s 存在歧义:具有函数式显式类型转换的表达式语句(5.2.3),因为其最左侧的子表达式与第一个声明符以a开头的声明无法区分..在这些情况下,该声明是一个声明.
(
§8.3[dcl.meaning] p6
在具有表格的声明
T D
中D
( D1 )
所含的类型说明符-ID是相同的,所述含有的声明符-ID的声明
T D1
括号不会改变嵌入式声明符id的类型,但它们可以改变复杂声明符的绑定.
我有时候讨厌C++ ......就像刚才一样. (19认同)
有人可以澄清一下:这是一个"最令人烦恼的解析"问题还是无关的事情? (7认同)
@ user10607我们怎么称它为"略显烦恼的解析"?它可能是"令人烦恼",因为它是模棱两可的,但它不像传统的"最令人头疼的"T函数(U(x),U(y));`,也可能不像"有点烦恼的解析"那样令人烦恼"`T func();` (2认同)
marcinj.. 17
因为它定义了T类型的变量:
http://coliru.stacked-crooked.com/a/d420870b1a6490d7
#includestruct 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)(); }; }
可能还有其他例子.
T(i_do_not_exist);
是一个具有相同含义的对象声明T i_do_not_exist;
.
N4567§6.8[stmt.ambig] p1
语法中涉及表达式语句和声明 s 存在歧义:具有函数式显式类型转换的表达式语句(5.2.3),因为其最左侧的子表达式与第一个声明符以a开头的声明无法区分..在这些情况下,该声明是一个声明.
(
§8.3[dcl.meaning] p6
在具有表格的声明
T D
中D
( D1 )
所含的类型说明符-ID是相同的,所述含有的声明符-ID的声明
T D1
括号不会改变嵌入式声明符id的类型,但它们可以改变复杂声明符的绑定.
因为它定义了T类型的变量:
http://coliru.stacked-crooked.com/a/d420870b1a6490d7
#includestruct 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)(); }; }
可能还有其他例子.
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。