使赋值运算符在声明上工作

make assignment operator work on declaration

本文关键字:工作 声明 赋值运算符      更新时间:2023-10-16

我试图创建一个不可变的Angle类(如下所示(。 Angle z = 42;不起作用。我如何让它工作?样本:

  Angle a(1); // works
  Angle b; b = 2; // works
  Angle c {25}; // works
  Angle d {26.0}; // works
  Angle e = 27.0; // doesn't compile -- why not?
  auto f = Angle(28.0); // works

源:

  class Angle {
      double _angle;
    public:
      explicit Angle(double value) noexcept : _angle(wrap0To2Pi(value)) {}
      Angle() = default;
      Angle(const Angle& angle) noexcept : _angle(angle._angle) {}
      Angle(const Angle&& angle) noexcept : _angle(angle._angle) {}
      operator double() const { return _angle; }
      Angle& operator=(const Angle& f) noexcept { _angle = f._angle; return *this; }
      Angle& operator=(double t) { _angle = wrap0To2Pi(t); return *this; }
      Angle operator+(Angle value) const { return Angle(_angle + value._angle); }
      Angle operator-(Angle value) const { return Angle(_angle - value._angle); }
      Angle operator*(Angle value) const { return Angle(_angle * value._angle); }
      constexpr static double DEFAULT_ANGLE_TOLERANCE = 0.0001;
      bool equals(Angle value, double tolerance = DEFAULT_ANGLE_TOLERANCE) const; // needs to wrap
      bool operator==(Angle value) const { return equals(value); }
      bool operator!=(Angle value) const { return !equals(value); }
      ...

还有什么我应该在这里改变的吗?谢谢你的时间。

在表单的定义中

Angle e = 27.0;

只有初始化,没有赋值。这将尝试调用将接受double参数的Angle构造函数。但是,由于已将Angle(double)构造函数标记为explicit,因此无法使用此语法执行此转换。

如果您希望此功能正常工作,请删除 explicit 关键字。