星期五, 十二月 13, 2013

C++ 11 迷茫的语言设计师们

刚刚看完c++11的激动过去了,再实际测试使用中,碰到了许多啼笑皆非的语言行为,
或者说实现和设计完全背离的行为。
C++11给出了很好的uniform initialization的方式。即花括号{}
auto i{10};非常优雅。
但是,且慢。
struct ABC_def
{
  string name;
  int tall{20};//给个默认的初始值吧。
}
然后
ABC_def test={"William",1000};
g++ 4.8.1 编译通不过了。
blabla:
error: could not convert '{"William",1000}' from '<brace-enclosed initializer list>' to 'BALL_DATA'
  BALL_DATA data=
{"William",1000};
 
What Hell?
Google !果然发现了有关聚合初始化的一些语言规范限制:
http://en.cppreference.com/w/cpp/language/aggregate_initialization
 
no brace-or-equal initializers for non-static members 非静态成员.不能有默认的值语法
 
 为什么语言规范里会有这么愚蠢的限制?且慢吐槽!先看看规范提交大师们的解释或者思路。
找了许久,只是看到一些讨论的帖子,完全没有找到一个理由解释这种限制的原因,
而且据说要在c++14里消掉这种限制............
 
C++ 的各位大神把一个语言规范弄成这样。。。惭愧吗?