C++ - 为什么编译器不允许分配易失变量



编译器不自动生成易失性赋值操作符,从而阻止赋值的原因是什么?

一个最小的例子:

struct A{};
A a;
volatile A b;
b = a;

我想你的意思是为什么当你创建一个类

class C {
// assignment operator auto generated
};

你得到的赋值操作符是

C& operator=(C const&) = default;

C volatile& operator=(C volatile const&) volatile = default;

所以volatile glvalue不能在两边。

原因可能与成本有关。Volatile对象抑制某些优化,限定符坚持子对象(都是在const_cast的痛苦下)。它们在野外也非常罕见,实际上没有人声明易失性类对象。如果c++默认生成了一个volatile赋值操作符,那么所有代码都需要默认支付代价,即使它们不使用volatile对象。但是c++的设计理念是相反的,我们不用为不用的东西买单。

如果你正在处理一个需要创建易失性对象的库,而它在这一点上崩溃了,那么它的设计很差。但老实说,更有可能的是,标准库从来没有指望将其对象声明为volatile,所以也许你应该重新考虑这样做。

最新更新