¿Qué cambios en C ++ hicieron que la inicialización de copia funcione para la clase con un constructor explícito?

Considera este código:

struct X{
    explicit X(){}
    explicit X(const X&){}
};

void foo(X a = X()){}

int main(){}

Usando el estándar C ++ 14, tanto GCC 7.1 como clang 4.0rechaza El código, que es lo que esperaba.

Sin embargo, usando C ++ 17 (-std=c++1z),ambos aceptan el código. ¿Qué regla cambió?

Para que ambos compiladores exhiban este mismo comportamiento, dudo que esto sea un error. Pero por lo que puedo decir, el último borrador todavía dice que el argumento predeterminado usa la semántica decopia-inicialización 1. De nuevo, sabemos queexplicit los constructores solo permitiráninicialización directa 2.

1: dcl.fct.default / 5; 2: class.conv.ctor / 2

Respuestas a la pregunta(1)

Su respuesta a la pregunta