C++中为何整数2无法隐式转换为MyClass对象匹配operator+重载?
编译报错核心原因
这个报错的本质是C++的引用绑定规则限制,和构造函数加不加explicit没有关系:
- C++语法明确规定:非const修饰的左值引用(即代码中写的
MyClass&),无法绑定到临时对象(右值)。 - 回到代码的
obj1 + 2调用场景:左操作数obj1是具名的左值,可以正常匹配第一个MyClass&形参;但右操作数是整数字面量2,就算MyClass(int)构造函数支持隐式转换,转换得到的是一个没有变量名的临时MyClass对象,属于右值,根本没法绑定到第二个形参要求的非const左值引用上,编译器自然找不到匹配的operator+重载,抛出错误。
为什么去掉参数的&就能编译通过
把参数的引用符去掉之后,函数参数变成值传递的MyClass类型,传参时会直接用隐式转换生成的临时对象拷贝构造形参,不存在引用绑定的规则限制,因此可以正常匹配函数签名,编译通过。
常规正确写法
实现二元算术运算符时,本身就不应该修改操作数,标准写法是用const左值引用做参数,const左值引用允许绑定右值临时对象,既可以避免拷贝开销,也能支持隐式转换的传参场景:
MyClass operator +(const MyClass& lOperand, const MyClass& rOperand) { // 具体加法逻辑 return lOperand; }
内容的提问来源于stack exchange,提问作者Young_cun_yi_ba
相关产品推荐
相关产品推荐

