C++ 使用带有叮当声的初始值设定项列表初始化简单结构

C++ 使用带有叮当声的初始值设定项列表初始化简单结构,c++,types,initialization,clang,C++,Types,Initialization,Clang,使用clang3.1编译 我应该指出,这是在GCC4.6.1上编译的 我目前的理解是,problem是一种非聚合类型,因为它是一个结构数组,使得它是复合的,而不仅仅是一个结构或数组 但是将-std=c++11标志发送到clang并不能缓解问题 更新:好的。看来我的clang版本有缺陷,无论出于什么原因都无法处理 更传统的初始化方式是什么?我是这样做的吗?这可以编译,但它会生成相同的代码吗?它会调用ctor而原版不会 struct E_Point { double x, y; E_Poin

使用
clang
3.1编译

我应该指出,这是在GCC4.6.1上编译的

我目前的理解是,
problem
是一种非聚合类型,因为它是一个结构数组,使得它是复合的,而不仅仅是一个结构或数组

但是将
-std=c++11
标志发送到
clang
并不能缓解问题

更新:好的。看来我的
clang
版本有缺陷,无论出于什么原因都无法处理

更传统的初始化方式是什么?我是这样做的吗?这可以编译,但它会生成相同的代码吗?它会调用ctor而原版不会

struct E_Point {
  double x, y;
  E_Point(): x(0), y(0) {}
  E_Point(double x, double y) : x(x), y(y) {}
};

E_Point problem[] = { 
  {0.3871953044519425, -0.91857980824611341}, // Error: initialization of non-aggregate type 'E_Point' with an initializer list
  {0.36139704793723609, 0.91605957361605106}, 
  {-0.8208980020500205, 0.52853407296583088}, 
  {0.36178501611208552, 0.88880385168617226}, 
  {-0.43211245441046209, 0.6803420222771047} 
};

这是clang++中的一个bug:

在您的例子中,您可以使用对构造函数的显式调用,正如您在上一个代码段中提供的那样。至于语义是否真的相同(它会生成相同的代码),在大多数情况下都是一样的


不同语法将导致不同行为的情况是,正在构造的类型具有采用
std::initializer\u list
的构造函数,在这种情况下,大括号初始值设定项将构造该初始值设定项列表。如果类型没有这样的构造函数(如您的情况),则大括号初始值设定项将调用相应的构造函数。

是时候切换编译器了?是的,它确实有一个功能,可能您没有启用它,类似于
clang++-std=c++11[文件]
,默认情况下,clang不启用c++11功能,您必须显式启用。@Als:这不是c++11功能;这是基本的C++98内容。这是纯聚合初始化,应该可以工作。顺便说一句,您的理解是错误的,聚合数组本身就是聚合。代码是正确的,它使用clang++3.1(tags/Apple/clang-318.0.54)[MacOX Lion]@StevenLu:Your
struct
编译,这里的问题是,在您的真实代码中存在聚合,而不是聚合。问题中的其他一切都只是时间的浪费,因为它是建立在原始类型不是它的前提下的<代码>E_点不是聚合,不能使用聚合初始化。如果您使用的是C++11编译器,情况会发生变化,因为可以在那里使用统一的初始化,内部大括号
{}
将映射到对构造函数的调用。您使用的确切版本是什么?
E_Point problem[] = {
    E_Point(0.3871953044519425, -0.91857980824611341), // 1559
    E_Point(0.36139704793723609, 0.91605957361605106), // 1560
    E_Point(-0.8208980020500205, 0.52853407296583088), // 1798
    E_Point(0.36178501611208552, 0.88880385168617226), // 1799
    E_Point(-0.43211245441046209, 0.6803420222771047) // 1800
};