using
declaração é comum e funciona para outros métodos de membros, incluindo construtor, mas para operador de conversão não parece tão simples. GCC tem sintaxe using base::operator base
para introduzir, que é negada por Clang. Declarar uma função forward é aceito por ambos os compiladores, mas é um pouco complicado na minha opinião.
exemplo foi testado com gcc 14.2.0 e clang 19.1.7, std=c++20. Herança SFINAE rejeitada por clang.
struct base {
template <typename T> requires (std::is_integral_v<T>)
operator T() const { printf("to int\n"); return 0; }
};
struct derived: base {
//using base::operator; // denied by clang & gcc
//using base::operator base; // denied by clang
template <typename T> requires (std::is_floating_point_v<T>)
operator T() const { printf("to float\n"); return 0; }
// both accept
template <typename T> requires requires { (T) std::declval<base>(); }
operator T() const { return base::operator T(); }
};
derived D;
(int) D; // -> to int
(float) D; // -> to float