C++ -为什么编译器不允许分配volatile变量[已关闭]

gblwokeq  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(135)

4天前关闭。
Improve this question
编译器不自动生成volatile赋值操作符,从而阻止赋值的原因是什么?
举个最小的例子:

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

ctzwtxfj1#

我想你是指为什么当你创建一个类的时候

class C {
  // assignment operator auto generated
};

得到的赋值运算符是

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

而不是

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

所以volatile glvalue不能在任何一边。
原因可能与成本有关。易失性对象会抑制某些优化,而限定符则会依附于子对象(都在const_cast的痛苦之下)。它们在野外也非常罕见,就像真的一样,实际上从来没有人声明过volatile类对象。如果C默认生成了volatile赋值运算符,那么所有代码都将需要在默认情况下付出代价,尽管他们没有使用volatile对象,但是C是用相反的哲学设计的,我们不为我们不使用的东西付费。
如果你正在处理一个需要创建volatile对象的库,并且它在这一点上崩溃了,那么它的设计就很糟糕。但是老实说,很可能这个库从来没有指望过将它的对象声明为volatile,所以也许你应该重新考虑这样做。

相关问题