It seems to me that there's a discrepancy in handling explicit default constructors. Based on my tests, this works:
struct X {explicit X() {}}; void f(X) {} int main() { f({}); } However, if the explicit constructor is defaulted, gcc accepts the code: struct X {explicit X() = default;}; void f(X) {} int main() { f({}); }