https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69293
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to ForEveR from comment #0) > In code, is_constructible<T, Args..., inner_allocator_type>::value is false, > since use_arg receives Alloc by reference, but there is no test for this > case in libstdc++. There doesn't need to be a check for that case, because if the is_constructible<T, allocator_arg_t, Alloc, Args...> case is false then we will try to construct as T(Args..., Alloc), and so if that is not constructible then we get an error, i.e. it's ill-formed. We don't need to test is_constructible, we can just attempt the cosntruction. The bug is in the standard: it says that the actual construction is done as T(Args..., Alloc&) which is not the same as the is_constructible test, so it's possible for the is_constructible test to fail but for the actual construction to succeed. That should not be possible. I can add a static assertion to the __uses_alloc<true, ...> partial specialization, as that will improve the diagnostics anyway, and cause this example to be ill-formed.