我正在试图理解一些与C++11统一初始化相关的边界情况,但我无法弄清楚为什么会出现这种情况:
struct Base
{
int x,y,z;
};
struct Derived : Base
{
};
static_assert (std::is_trivial<Base>::value, "Base must be trivial");
static_assert (std::is_trivial<Derived>::value, "Derived must be trivial");
Base b{1, 2, 3}; // 1) This compiles fine
Derived d{10, 20, 30}; // 2) This fails
标记为 2 的行出现了错误,无论是在clang 3.1
还是g++ 4.7
中都会提示"no matching constructor for initialization of Derived"。
我不明白为什么,在Derived的情况下,它试图调用一个构造函数而不是执行(我不知道如何称呼它,也许是聚合初始化?),就像第1行的情况一样。
以下推理中有什么问题吗?
A) 是平凡的,保证它可以静态初始化
B) 要进行静态初始化,就不能在运行时执行任何代码,因此不需要调用构造函数
A+B
=> 为什么它要在已知平凡的类型上调用构造函数呢?
我非常困惑......
constexpr
。 - Matthieu M.struct X { int a,b; };
具有平凡的默认和复制构造函数。它没有任何接受1或2个整数的构造函数,但是因为它是一个聚合体,您可以在变量定义的地方设置值:X x = { 1,2 };
。请注意,我故意避免使用花括号,原因有两个:语法不如特性重要,并且在C++11中,该语法可用于调用构造函数。 - David Rodríguez - dribeas