Аналогично Новый синтаксис «= default» в C++11
Но что касается полей-членов, все они имеют значения по умолчанию.
Данный:
struct Pixel {
int r = 0x00;
int g = 0x00;
int b = 0x00;
Pixel() {}; // Empty
Pixel() = default; // Default
};
Какие семантические различия имеют два стиля ctor в этом случае?
@NathanOliver Конструктор = default
также нетривиален. Разница в том, что он может (в зависимости от остальной части определения класса) быть тривиальным, тогда как {}
никогда не будет тривиальным. Но наличие инициализатора члена по умолчанию в любом случае делает конструктор по умолчанию нетривиальным. Тривиальный конструктор по умолчанию — это всегда нуп, который вообще не выполняет никакой инициализации.
@user17732522 user17732522 Ах да, инициализатор убирает тривиальность. Так что никакой разницы в данном конкретном случае нет.
Аналогично новому синтаксису «= default» в C++11. Но что касается полей-членов, все они имеют значения по умолчанию.
Обе эти формы будут использовать инициализаторы внутри класса (так называемые инициализаторы членов по умолчанию) для нестатических элементов данных r
, g
и b
согласно class.base.init, как описано ниже. Кроме того, оба вектора нетривиальны.
Из class.base.init:
В конструкторе без делегирования, отличном от неявно определенного конструктора копирования/перемещения ([class.copy.ctor]), если данный потенциально созданный подобъект не обозначен идентификатором-инициализатора-mem (включая случай, когда нет mem-initializer-list, поскольку у конструктора нет инициализатора ctor), тогда
- если сущность является нестатическим элементом данных, имеющим инициализатор элемента по умолчанию ([class.mem]), и либо
[...]
[...]
сущность инициализируется из инициализатора члена по умолчанию, как указано в [dcl.init];
В некоторой степени зависит от того, какую версию C++ вы используете (агрегированные правила менялись в каждой версии). Кроме того, пустой конструктор не может считаться тривиальным, поскольку он используется по умолчанию.