using
声明很常见,适用于包括构造函数在内的其他成员方法,但对于转换运算符来说,似乎不那么简单。GCC 有语法using base::operator base
需要介绍,但 Clang 拒绝了。两个编译器都接受声明前向函数,但在我看来这有点复杂。
示例使用 gcc 14.2.0 和 clang 19.1.7、std=c++20 进行了测试。SFINAE 继承被 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