使用 C++ 多年后,我意识到使用自定义类时语法中的一个怪癖。
尽管是正确的语言行为它允许创建非常具有误导性的界面。
这里的例子:
class complex_arg {
double r_;
double phi_;
public:
std::complex<double> value() const {return r_*exp(phi_*std::complex<double>{0, 1});}
};
int main() {
complex_arg ca;
ca.value() = std::complex<double>(1000., 0.); // accepted by the compiler !?
assert( ca.value() != std::complex<double>(1000., 0.) ); // what !?
}
https://godbolt.org/z/Y5Pcjsc8d
可以对类定义做什么来防止这种行为?(或者至少标记该类的用户第三行并没有真正执行任何作业。)
我只看到一种出路,但它需要修改类,并且它不能很好地扩展(对于可以移动的大型类)。
const std::complex<double> value() const;
我也尝试过[[nodiscard]] value()
但这没有帮助。
作为最后的手段,也许可以对返回的类型做一些事情std::complex<double>
?(也就是说,假设一个人控制着该班级)
请注意,我知道有时可能需要(优化)分配给新获得的值并将其传递给另一个函数f( ca.value() = bla )
。我并不是质疑这种用法本身(尽管它也很令人困惑);我的问题主要是ca.value() = bla;
作为一个独立的声明,它的作用并不像看上去的那样。