Явно дефолтные конструкторы и инициализация переменных-членов
Я немного озадачен тем, что происходит, когда ctor явно дефолтен.
Два примера кода ниже эквивалентны?
Есть ли какие-либо ограничения на Y
быть в состоянии использовать первый вариант?
class X
{
public:
X() = default;
private:
Y m_y;
};
class X
{
public:
X() : m_y() {}
private:
Y m_y;
};
2 ответа
Есть два возможных источника различий.
X() = default;
не предоставляется пользователем.X() : m_y() {}
является. Первое может быть тривиальным; последнее никогда не бывает тривиальным. Кроме того, они будут вести себя по-другому, еслиX
Объект инициализирован значением.Набор инициализаций, выполняемых
X() = default;
эквивалентно тому изX() {}
, который по умолчанию инициализируетm_y
,X() : m_y() {}
значение инициализируетm_y
, В зависимости от того, чтоY
Это может быть по-другому. Например, еслиY
являетсяint
, тогда default-initialization оставит это неопределенное значение, в то время как value-initialization установит его в ноль.
Там тоже самое. С явным cto'rs вы только усиливаете его создание. В противном случае компилятор может избежать его создания, если вы не используете конструктор по умолчанию. Может быть интересно при создании общих библиотек. Для справки http://en.cppreference.com/w/cpp/language/default_constructor