提问人:George 提问时间:10/30/2023 最后编辑:George 更新时间:10/30/2023 访问量:60
为什么重载+运算符不能与类static_cast的基元类型一起使用?
Why the overloaded+ operator cannot be used with a primitive type static_cast to a class?
问:
我刚刚开始深入研究 C++。最近,我遇到了一个任务,即创建一个 bMoney 类来存储一些货币价值。同时,该类必须具有重载运算符 +、-、* 和 /。此外,此类必须具有可在强制转换类型时使用的构造函数。
这是我所有运算符原型的代码。
сlass bMoney {
private:
long double money;
public:
explicit bMoney(long double _money = 0.0L) noexcept : money(_money) {};
bMoney operator+(bMoney &other) const;
bMoney operator-(bMoney &other) const;
bMoney operator*(long double times) const;
bMoney operator/(long double times) const;
};
但是,在测试代码的过程中,我遇到了一个有趣的错误。这是我的代码:
bMoney bm1(1.0);
long double ld = 2.0
bMoney bm2 = bm1 + static_cast<bMoney>(ld); //here's the error
我被警告说,没有对应于此类运算符(bMoney + bMoney)的 + 运算符。但是,一旦我删除了 + 运算符中的参数引用,此警告就消失了。为什么会这样?我认为这与static_cast有关,但仍然无法弄清楚。如果可以,请帮助我
我尝试做 static_cast<bMoney>(&ld),但没有帮助。我刚刚开始理解指针和参考资料,所以我有点害怕它们。
答:
static_cast
创建一个 prvalue(一个临时对象),而你期望一个 lvalue - 由于参数。prvalues 不能绑定到 左值引用。删除引用说明符时,prvalue 将通过 copy-elision 直接初始化到参数中。
另一方面,const
左值引用能够绑定到右值s。因此,将运算符参数声明为常量
左值引用的通常做法可以消除该问题。operator+
mutable
bMoney&
mutable
顺便说一下,这不叫潜入 C++。这是基本的现代 C++ 材料;但是那些正式学术界的恐龙导师太无知了,无法教你正确的东西。给自己买一本名为“现代C++”的书,并在2011年之后出版。普通开发人员认为是基本/高级的东西往往与现实相反。现代 C++ 中最基本的东西是最新的,而 C++11 之前的大多数东西都是高级的。原始指针是专家级的,智能指针是中级的,但 STL 容器和范围是初级的。
下一个:“*/”作为数据转换运算符
评论
bMoney operator+(bMoney &other) const;
是错误的签名。 既不应修改,也不应修改operator+
a + b
a
b
static_cast<bMoney>(ld)
是右值。不能将右值绑定到非左值引用。const
const
bMoney operator+(const bMoney &other) const;