Я пытаюсь обдумать некоторые угловые случаи с униформной инициализацией С++ 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 завершается ошибкой с сообщением "нет подходящего конструктора для инициализации Derived" как с clang 3.1
, так и с g++ 4.7
.
Я не могу понять, почему в случае Derived он пытается вызвать конструктор и не выполняет (я не знаю, как это назвать, может быть, агрегатная инициализация?), как в случае с линия 1).
Что-то в следующих рассуждениях неверно?:
A) Тривиальность гарантирует, что он может быть статически инициализирован
B) Для статической инициализации никакой код не должен выполняться во время выполнения, и, следовательно, не требуется вызов конструктора A+B
=> почему он пытается вызвать конструктор для типа, который, как он знает, является тривиальным?
я очень запуталась....