为什么使用大括号init初始化对象是合法的,即使它不是聚合?

时间:2014-08-25 12:43:50

标签: c++ c++11

我不明白为什么允许变体1。

class A {
public:
    A(int x, int y) : a{x}, b{y} {}

private:
    int a;
    int b;
};

class B : public A {
public:
    // Variant 1
    //B(int x, int y, int z) : A{x,y}, c{z} {}

    // Variant 2
    B(int x, int y, int z) : A(x,y), c{z} {}
private:
    int c;
};

int main() {
    B b(1,2,3);
}

此代码使用-std = c ++ 11构建。

  1. 变体1和2中哪一个更好,为什么?
  2. 这里:http://en.cppreference.com/w/cpp/language/aggregate_initialization它表示允许使用大括号init,该类必须是聚合,而A不是。为什么这仍然可以编译?

3 个答案:

答案 0 :(得分:6)

  

http://en.cppreference.com/w/cpp/language/aggregate_initialization它表示允许使用大括号init,该类必须是聚合

不,它表示要进行聚合初始化,该类必须是聚合。

但是您的代码不执行聚合初始化;它执行list initialisation

答案 1 :(得分:6)

  

这里:http://en.cppreference.com/w/cpp/language/aggregate_initialization它表示允许使用大括号init,该类必须是聚合,而A不是。为什么这仍然可以编译?

它还说:

  

聚合初始化是list-initialization的一种形式,用于初始化聚合

这不是正确推测的聚合初始化。但是,它仍然被允许作为列表初始化。自从C ++ 11大括号可用于初始化非聚合的东西。它根本不算作聚合初始化。

答案 2 :(得分:0)

我相信C ++ 11的目标之一是拥有统一的初始化语法,而不必考虑是否使用=( )= { }来实现执行初始化只需在任何地方使用{ }