Разница заключается в том, какое из них происходит, когда применяются оба условия: если T является агрегатным классом (в отличие от массива), который, безусловно, имеет конструктор по умолчанию, и braced-init-list пуст. Конечно, чтобы понять, почему это важно, мы должны отличать инициализацию значения от агрегатной инициализации из пустого списка.
Инициализация значения инициализирует объект нулем, а затем инициализирует его по умолчанию, что для агрегата является инициализацией по умолчанию каждого из его членов, поэтому инициализация значения выполняется по элементам (плюс заполнение нулями). Агрегатная инициализация инициализирует каждый член из {}
, что также является инициализацией значения для многих типов, но является инициализацией по умолчанию для членов типа класса с предоставленным пользователем конструктором по умолчанию. Разницу можно увидеть в
struct A {A() {} int i;};
struct B {A a;}; // aggregate
B b{}; // i is 0 in C++11, uninitialized in C++14
B b2=B(); // i is 0 in both versions
Только в C++14 агрегаты могут иметь инициализаторы элементов по умолчанию; это, конечно, не может способствовать различию в поведении между двумя языковыми версиями, но в любом случае оно не ведет себя по-разному между этими двумя правилами (поскольку оно заменяет только общую инициализацию по умолчанию).
person
Davis Herring
schedule
28.06.2020
@cigien
и@StoryTeller
за правки. - person pvc   schedule 28.06.2020