内置运算符是否参与运算符重载决议?1+1是否涉及该过程?
关于C++中
1 + 1是否涉及运算符重载决议的问题 疑惑来源
你对C++标准中over.built/1条款的两段描述存在困惑:
代表[expr.compound]中定义的内置运算符的候选运算符函数在本子条款中指定。这些候选函数会按照[over.match.oper]中的描述参与运算符重载决议过程,且仅用于该目的。
由于内置运算符仅接受非类类型的操作数,且运算符重载决议仅当操作数表达式原本具有类或枚举类型时才会发生,因此只有当操作数存在可转换为运算符适用的非类类型的用户定义转换,或者操作数为可转换为适用类型的枚举类型时,运算符重载决议才会解析为内置运算符。
明确结论
1 + 1不涉及运算符重载决议。
原因解释
- 运算符重载决议的触发条件非常明确:仅当操作数是类类型或枚举类型,或者操作数需要通过用户定义转换才能转为类/枚举类型时,才会启动这个流程。
1是基础的int类型,完全不满足触发条件。 - over.built/1中提到的内置候选运算符函数,只有在重载决议被触发的场景下才会被纳入候选集。对于纯基础类型的运算,编译器会直接按照内置运算符的原生规则处理,根本不会进入重载决议的逻辑。
- 条款注释的描述是准确的:只有当操作数涉及类/枚举,或者需要用户定义转换适配内置运算符时,才会进入重载决议并可能匹配到内置候选函数。纯基础类型的运算不在这个范畴内,自然不会走重载决议流程。
内容的提问来源于stack exchange,提问作者cppbest
相关产品推荐
相关产品推荐

