9

以下代码在 gcc-4.7.1 和 clang-3.2 下都无法使用 -std=c++11 进行编译。所以我觉得我做错了什么。但我不知道为什么。有人可以给我一个提示吗?基本上,如果我删除 X 的类内成员初始化程序,它就可以工作。那么为什么初始化列表不能与类内成员初始化器一起使用呢?

struct X {
    int x = 1;
    int y = 1;
};

int main() {
    X x = {1, 2};
}

gcc 编译错误:

a.cpp: In function 'int main()':
a.cpp:7:16: error: could not convert '{1, 2}' from '<brace-enclosed initializer list>' to 'X'
4

1 回答 1

12

通过在声明点初始化非静态数据成员,您的类不再是聚合(参见 8.5.1 Aggregates [decl.init.aggr])。

一种解决方法是添加一个双参数构造函数。这允许您使用初始化器列表初始化,它允许与聚合初始化相同的语法,即使您的类在技术上不是聚合。

struct X {
  X(int x, int y) : x(x), y(y) {}
    int x = 1;
    int y = 1;
};

int main() 
{
    X x1{1, 2};
    X x2 = {1,2};
}

注意:对于 C++1y,这些规则已经放宽,这意味着您的类型确实是一个聚合。

于 2013-01-29T08:44:41.320 回答