uais alterações no C ++ fizeram a inicialização de cópias funcionar para a classe com construtor explícit

Considere este código:

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

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

int main(){}

sando o padrão C ++ 14, GCC 7.1 e clang 4.0 rejeita o código, o que eu esperava.

No entanto, usando C ++ 17 -std=c++1z), ambos aceitam o código. Que regra mudou?

Para que os dois compiladores exibam esse mesmo comportamento, duvido que seja um bug. Mas, até onde eu sei, o último rascunho ainda diz que o argumento padrão usa a semântica de cópia-inicialização 1. Mais uma vez, sabemos queexplicit construtores só permitirão inicialização direta 2.

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

questionAnswers(1)

yourAnswerToTheQuestion