基本类型volatile初始化是一种可观察的行为吗?

Oli*_*liv 7 c++ initialization volatile language-lawyer

考虑这个功能:

void f(void* loc)
  {
  auto p = new(loc) volatile int{42};
  *p = 0;
  }
Run Code Online (Sandbox Code Playgroud)

我已经通过clang,gcc和CL检查生成的代码,它们都没有在初始化时删除.(答案可能是硬件:).

它是编译器为标准提供的扩展吗?标准是否允许编译器不执行写42?

Actualy对于类类型的对象,指定对象的构造函数在不考虑volatile限定符[class.ctor]的情况下执行:

可以为const,volatile或const volatile对象调用构造函数.const和volatile语义(10.1.7.1)不适用于正在构造的对象.它们在最派生对象(4.5)的构造函数结束时生效.

Pet*_*ker 0

[intro.execution]/8 列出了一致实施的最低要求;这些也称为\xe2\x80\x9c可观察行为\xe2\x80\x9d。第一个要求是\xe2\x80\x9c对易失性对象的访问严格按照抽象机的规则进行评估。\xe2\x80\x9d编译器需要产生所有可观察的行为。特别是,不允许删除对易失性对象的访问。请注意,这里的 \xe2\x80\x9cobject\xe2\x80\x9d 是在编译器编写器\xe2\x80\x99s 意义上使用的:它包括内置类型。

\n