https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95066
--- Comment #1 from Owen Smith <ojman101 at protonmail dot com> --- ---------------------------------------------------------------- #include <type_traits> template <typename, typename> class IsSafelyCastable : public std::false_type {}; template <> class IsSafelyCastable<int, float> : public std::true_type {}; template <typename T> struct Foo { template <typename U> explicit(!IsSafelyCastable<T, U>::value) operator Foo<U>() { return {}; } }; int main() { Foo<float> a; Foo<int> b = a; } ---------------------------------------------------------------- Inlining the definition yields the correct error with GCC 9.3.0: ---------------------------------------------------------------- main.cpp: In function 'int main()': main.cpp:17:18: error: conversion from 'Foo<float>' to non-scalar type 'Foo<int>' requested 17 | Foo<int> b = a; | ----------------------------------------------------------------