非CV限定转换函数的隐式对象参数为何能绑定右值成为可行候选?
问题原因解析
你的困惑来源于对C++标准中重载解析规则和成员函数调用语义的误解,具体原因如下:
可行函数判断与调用语义的区别
[over.match.viable]/4条款约束的是参数绑定的可行性,但C++标准并没有在可行函数筛选阶段,将“非const左值引用绑定右值”的成员函数隐式参数情况排除在外。也就是说,重载解析时只会判断语法上的绑定可能性,而不会提前检查调用后的行为是否合法。历史规则与编译器兼容性
在C03标准中,右值允许直接绑定到非const左值引用,因此这类转换运算符作为可行函数完全符合当时的规则。即使在C11及以后的标准中,虽然调用非const成员函数在右值对象上的行为被定义为未定义,但编译器为了兼容旧代码,仍然会将这类函数视为可行候选,不会在重载解析阶段排除它们。转换运算符的特殊语境
在int res = S();的初始化语境中,用户定义的转换运算符调用属于隐式转换流程,编译器会优先枚举所有符合类型转换要求的候选函数,而不会因为隐式对象参数是右值就排除非const限定的转换运算符。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

