为何我的C++类调用了错误的operator()重载版本?
为什么std::cout输出时调用了const版本的operator()?
首先明确C++成员函数重载决议的核心规则:
- 调用非const对象的成员函数时,编译器优先选非const版本的重载。因为非const成员函数的隐式
this参数是T*,和非const对象的类型完全匹配;而const成员函数的this参数是const T*,需要把非const对象的指针做限定转换,这是优先级更低的匹配。
那你的代码里std::cout << f(1,1)为啥会调用const版本?
可能的原因:
旧编译器的行为偏差
部分旧版本编译器(比如GCC 7.x及更早)处理这种场景时,会错误地优先选择const版本。升级到GCC 8+、Clang 6+这类较新的编译器后,就会按标准规则选非const版本,输出Write而不是Read。特定上下文的编译器实现差异
虽然标准规定重载决议不考虑返回值,但某些编译器在把返回值传给接受const T&的函数(比如std::cout的operator<<)时,可能做出不符合标准的选择,但这属于编译器实现的问题,不是标准要求的行为。
验证方法:
你可以修改代码,强制调用非const版本来验证:
// 显式调用非const版本 std::cout << static_cast<Foo<int>&>(f)(1,1) << std::endl;
这时候会输出Write,符合标准规则的预期。
另外,你的代码里operator()的j参数没被使用,属于逻辑冗余,但不影响重载决议的结果。
内容的提问来源于stack exchange,提问作者cnewbie
相关产品推荐
相关产品推荐

