为什么重载+运算符不能与类static_cast的基元类型一起使用?

Why the overloaded+ operator cannot be used with a primitive type static_cast to a class?

提问人:George 提问时间:10/30/2023 最后编辑:George 更新时间:10/30/2023 访问量:60

问:

我刚刚开始深入研究 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),但没有帮助。我刚刚开始理解指针和参考资料,所以我有点害怕它们。

C++ 强制转换 运算符

评论

0赞 463035818_is_not_an_ai 10/30/2023
bMoney operator+(bMoney &other) const;是错误的签名。 既不应修改,也不应修改operator+a + bab
1赞 463035818_is_not_an_ai 10/30/2023
请在问题中包含警告/错误消息
1赞 Yksisarvinen 10/30/2023
static_cast<bMoney>(ld)是右值。不能将右值绑定到非左值引用。const
0赞 Pete Becker 10/30/2023
由于某种原因,评论没有提到的是要修复它,只需添加:constbMoney operator+(const bMoney &other) const;
0赞 Scott Hunter 10/30/2023
@PeteBecker:这听起来像是一个答案。

答:

0赞 Red.Wave 10/30/2023 #1

static_cast创建一个 prvalue(一个临时对象),而你期望一个 lvalue - 由于参数。prvalues 不能绑定到 左值引用。删除引用说明符时,prvalue 将通过 copy-elision 直接初始化到参数中。 另一方面,const 左值引用能够绑定到右值s。因此,将运算符参数声明为常量左值引用的通常做法可以消除该问题。operator+mutablebMoney&mutable

顺便说一下,这不叫潜入 C++。这是基本的现代 C++ 材料;但是那些正式学术界的恐龙导师太无知了,无法教你正确的东西。给自己买一本名为“现代C++”的书,并在2011年之后出版。普通开发人员认为是基本/高级的东西往往与现实相反。现代 C++ 中最基本的东西是最新的,而 C++11 之前的大多数东西都是高级的。原始指针是专家级的,智能指针是中级的,但 STL 容器和范围是初级的。