https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117294
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #1) > Even if we remove the constrained function template and just write an > assertion based on the underlying built-in, there's no more information: > > struct A { > explicit A(int) {} > }; > > template <typename T> > struct Foo { > T a = 1; > }; > > auto tryit() { > static_assert( __is_constructible(Foo<A>) ); > } For this simpler case, Clang gives: def.cc:7:11: error: no viable conversion from 'int' to 'A' 7 | T a = 1; | ^ def.cc:6:8: note: in instantiation of default member initializer 'Foo<A>::a' requested here 6 | struct Foo { | ^ def.cc:11:18: note: in evaluation of exception specification for 'Foo<A>::Foo' needed here 11 | static_assert( __is_constructible(Foo<A>) ); | ^ def.cc:1:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A &' for 1st argument 1 | struct A { | ^ def.cc:1:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A &&' for 1st argument 1 | struct A { | ^ def.cc:2:14: note: explicit constructor is not a candidate 2 | explicit A(int) {} | ^ 1 error generated. Which I suppose is much closer to what Barry is asking for. So it's certainly possible, and I'm just not very imaginative.