"screwing up" 赋值运算符的后果是什么?

What are the consequences of "screwing up" the assignment operator?

我想要具有名称和单位的双精度值,但我想像使用简单双精度值一样使用它们。例如我想像这样使用它们:

int main(){
    NamedValue a("a","m");
    NamedValue b("b","m");
    NamedValue c("c","m^2");
    a = 3;
    b = 5;
    c = a*b;
    std::cout << a << b << c <<  std::endl;
    return 0;
}

输出应该是:

a = 3 m
b = 5 m
c = 15 m^2

我想到了这个解决方案:

class NamedValue  {
public:
    NamedValue(std::string n,std::string u) : name(n),units(u){}
    const std::string name;
    const std::string units;
    void operator=(double v){this->value = v;}
    void operator=(const NamedValue& v){this->value = v.value;}
    operator double() const { return value; }      
private:
    double     value;
};

std::ostream& operator<<(std::ostream& stream,const NamedValue& v) {
     stream << v.name << " = " << (double)v <<  " " << v.units << std::endl;
     return stream;
}

Unitl 现在运行良好,但我主要关心的是赋值运算符 void operator=(const NamedValue& v){this->value = v.value;} 不完全符合人们通常对赋值运算符的期望。

会不会有什么不好的后果?

我正在考虑将对象作为参数传递之类的事情。然而,像这样的函数

NamedValue test(NamedValue x){return x;}

工作没有问题,因为不涉及赋值(仅复制构造函数)。我错过了什么吗?还有什么我应该注意的吗?

ps:以防万一你想知道,目前我不关心计算时检查单位。

赋值运算符完全没问题。唯一不寻常的是您没有 return 该对象,因此无法链接运算符调用。否则,它就是一个完全正常的运算符。