为何重载的+运算符无法适配基本类型static_cast至类对象的场景?
问题分析与解决方案
错误根源
你定义的operator+参数是非const左值引用(bMoney &other),但static_cast<bMoney>(ld)会生成一个临时bMoney对象——C++语法规则禁止临时对象绑定到非const的左值引用,因此编译器找不到匹配的operator+重载,直接报错。
修复方案
把运算符重载的参数改成const bMoney &other,利用const左值引用可以绑定临时对象的特性解决问题。修改后的类原型如下:
class bMoney { private: long double money; public: explicit bMoney(long double _money = 0.0L) noexcept : money(_money) {}; // 将参数改为const引用 bMoney operator+(const bMoney &other) const; bMoney operator-(const bMoney &other) const; bMoney operator*(long double times) const; bMoney operator/(long double times) const; };
修改后,bm1 + static_cast<bMoney>(ld)即可正常编译。
额外说明
static_cast<bMoney>(&ld)是错误用法:你把ld的指针(long double*)传给了需要long double的构造函数,类型完全不匹配,自然无效。最初的static_cast<bMoney>(ld)写法是正确的,只需配合const引用参数即可。operator-存在完全相同的问题,必须同步修改参数为const bMoney &,否则类似减法操作也会报错。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

