¿Por qué no se llama al constructor de copia cuando devuelve por valor un objeto inicializado en lista?

Entiendo que cuando los objetos se devuelven por valor de una función, se llaman sus constructores de copia. Si una clase tiene un constructor de copia eliminado, la devolución por valor fallará.

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

X f() {
   return X{};
}

error: call to deleted constructor of 'X'

C ++ 11 nos da inicializadores extendidos. Y leí en alguna parte en una publicación SO que este

X f() {
    return {};
}

es lo mismo que

X f() {
    return X{};
}

Entonces, ¿por qué el código de abajo no me da un error? Pasa e incluso llego a llamar a la función en main:

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

D f() { return {}; }

int main()
{
   f();
}

Aquí hay una demo. No se informa de ningún error. Me parece raro porque creo que debería llamarse al constructor de copia. ¿Alguien puede explicar por qué no se da ningún error?

Respuestas a la pregunta(1)

Su respuesta a la pregunta