正如@Nawaz已经指出:
当你有易失性对象时,你需要volatile copy-ctor.所以问题归结为:你什么时候需要易变的物体?
使用volatile关键字的主要原因通常是禁用优化.那就是你有这样的东西:
bool flag = false;
if(!flag) {}
Run Code Online (Sandbox Code Playgroud)
编译器将看到该标志无法更改,因此不需要每次都检查标志 - 所以它不会.但是,如果你使标志变量volatile - 它会.
以下是volatile关键字原始用法的意见:链接
简而言之,它最初用于通过MMIO访问硬件,这可能有点不寻常:
unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;
Run Code Online (Sandbox Code Playgroud)
并且由于优化,您不希望这3个分配成为一个.
这是Andrei Alexandrescu关于多线程软件中的易失性的一篇论文:链接
有一些文章批评亚历山大夫斯库的论文,但我找不到.关键在于他抛弃了不稳定的财产等等.
请注意@JanHudec指出的多线程非常重要的事情:
volatile对多线程上下文完全没用,因为虽然它阻止了优化,但它不会产生明显的障碍.如果没有那些在一个CPU上完成的写操作可能不会被另一个CPU看到(取决于架构; x86具有连贯的高速缓存,因此写入总是在那里可见).也
volatile没有强制执行该操作是原子的.在x86上,赋值总是原子的,但并非所有CPU体系结构都是如此.而像增量这样的更复杂的操作只能在原子上使用std::atomic.