如何使初始化列表和类成员初始化程序一起工作?

Kan*_* Li 9 c++ c++11

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

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

int main() {
    X x = {1, 2};
}
Run Code Online (Sandbox Code Playgroud)

gcc编译错误:

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

jua*_*nza 12

通过在声明点初始化非静态数据成员,您的类不再是聚合(请参见8.5.1聚合[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};
}
Run Code Online (Sandbox Code Playgroud)

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

  • "这允许你使用聚合初始化" - 这不完全正确,你现在正在做的是*list-initialization*. (3认同)
  • +1作为参考.我怀疑这样的事情,但是你打败我了:p (2认同)