使用带有clang的初始化列表初始化简单结构

时间:2012-06-06 02:49:33

标签: c++ types initialization clang

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进行编译3.1。

我应该指出,这是在GCC 4.6.1上编译的。

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

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

更新:好的。看起来我的版本clang有点瑕疵,无论出于何种原因都无法处理。

什么是更传统的初始化方法?我这样做吗?这编译,但它产生相同的代码?它原来不会打电话给ctor吗?

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

1 个答案:

答案 0 :(得分:2)

这是clang ++中的一个错误:

http://llvm.org/bugs/show_bug.cgi?id=12670

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

不同语法会导致不同行为的情况是,正在构造的类型具有采用std::initializer_list<>的构造函数,在这种情况下, brace-initializer 将构造该初始化程序名单。如果类型没有这样的构造函数,那么 brace-initializer 将调用相应的构造函数。