Почему конструктор копирования не вызывается при возврате по значению объекта, инициализированного списком?

Я понимаю, что когда объекты возвращаются по значению из функции, вызываются их конструкторы копирования. Если у класса есть удаленный конструктор копирования, возврат по значению завершится неудачей.

struct X {
    X(const X &) = delete;
};

X f() {
   return X{};
}

error: call to deleted constructor of 'X'

C ++ 11 дает нам расширенные инициализаторы. И я читал где-то на ТАКОМ посте, что это

X f() {
    return {};
}

такой же как

X f() {
    return X{};
}

Так почему же приведенный ниже код не выдаст мне ошибку? Это проходит, и я даже вызываю функцию в main:

struct D {
   D(const D &) = delete;
};

D f() { return {}; }

int main()
{
   f();
}

Вот демо. Об ошибках не сообщается. Я нахожу это странным, потому что я считаю, что должен быть вызван конструктор копирования. Может кто-нибудь объяснить, почему не дается ошибка?

Ответы на вопрос(1)

Ваш ответ на вопрос