为何std::enable_if作为额外函数参数时无法用于运算符重载?
为什么std::enable_if作为额外函数参数时无法用于运算符重载?
核心原因是C++标准对运算符重载的函数签名有严格的强制规定:每个运算符允许的参数数量、参数位置(成员/非成员函数的区别)都是固定的,你不能随意添加额外参数。
比如:
- 非成员版本的
operator+必须恰好接受2个参数 - 成员版本的前置
operator++不能有参数,后置版本只能有一个int类型的占位参数 - 所有运算符的参数列表都不能超出标准规定的范围
如果尝试给运算符重载添加std::enable_if类型的额外参数(哪怕是带默认值的),比如:
template<typename T> auto operator+(const T& lhs, const T& rhs, std::enable_if_t<std::is_integral_v<T>>* = nullptr) { return lhs + rhs; }
这段代码会被编译器判定为不是合法的运算符重载——因为它的参数数量不符合operator+的要求,编译器只会把它当成一个普通的、名为operator+的函数(但这种函数调用时也没法用+符号触发,完全失去了运算符重载的意义)。
而普通函数没有这样的签名限制,你可以自由添加带默认值的额外参数来实现enable_if的SFINAE效果,所以这种写法对普通函数有效,但对运算符重载完全不适用。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

