我不明白为什么允许变体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构建。
答案 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的目标之一是拥有统一的初始化语法,而不必考虑是否使用=
,( )
或= { }
来实现执行初始化只需在任何地方使用{ }
。