Явно дефолтные конструкторы и инициализация переменных-членов

Я немного озадачен тем, что происходит, когда ctor явно дефолтен.

Два примера кода ниже эквивалентны?

Есть ли какие-либо ограничения на Y быть в состоянии использовать первый вариант?

class X
{
public:
    X() = default;

private:
    Y m_y;
};

class X
{
public:
    X() : m_y() {}

private:
    Y m_y;
};

2 ответа

Есть два возможных источника различий.

  1. X() = default; не предоставляется пользователем. X() : m_y() {} является. Первое может быть тривиальным; последнее никогда не бывает тривиальным. Кроме того, они будут вести себя по-другому, если X Объект инициализирован значением.

  2. Набор инициализаций, выполняемых 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

Другие вопросы по тегам