C++ std::是可构造的和易失的类型吗

C++ std::是可构造的和易失的类型吗,c++,c++11,volatile,typetraits,C++,C++11,Volatile,Typetraits,看看这个问题的答案: 我看到标准说,如果一个类型有一个易失性成员,即使该成员是一个基本类型,它也不容易被复制。这似乎是因为需要确保以原子方式更新易失性成员,并且可能会违反琐碎的可复制性所隐含的逐字节复制 但这是否也意味着在这些类型上,is_琐碎地_default_可构造性应该失败 这似乎是一个正确的检查,看看一个类是否可以“正确地”进行零初始化(memset-able),方法与使用可复制来检测memcpy能力的方法相同。出于同样的基本原因,memset可能是非原子的 然而,这个假设可能是错误的

看看这个问题的答案:

我看到标准说,如果一个类型有一个易失性成员,即使该成员是一个基本类型,它也不容易被复制。这似乎是因为需要确保以原子方式更新易失性成员,并且可能会违反琐碎的可复制性所隐含的逐字节复制

但这是否也意味着在这些类型上,is_琐碎地_default_可构造性应该失败

这似乎是一个正确的检查,看看一个类是否可以“正确地”进行零初始化(memset-able),方法与使用可复制来检测memcpy能力的方法相同。出于同样的基本原因,memset可能是非原子的

然而,这个假设可能是错误的。假设一个平凡的可构造类是memset可初始化的,这是错误的吗?如果不正确,什么是正确的检查来确定这一点


更清楚一点,我并没有假设is_琐碎地_default_constructible实际上告诉了我关于memset可构造性、零初始化性或任何这些的语义正确性。我的意思是,它可以告诉我这是否可能,就像记忆能力一样。可能是可复制的对于所有情况都足够了,因为作为缓冲区的构造在逻辑上等同于在构造后将一些(可能是静态的或算法定义的)缓冲区复制到对象中?

“易失性成员以原子方式更新”标准中没有要求对
volatile
值进行原子更新。您可以在
volatile
值上进行数据竞争。@Nicolas是的,恐怕我不太了解链接中讨论的实际“内存撕裂”问题。这可能与复制和构造的区别有关。具体地说,从一些字节缓冲区(或字节填充)初始化和复制字节缓冲区可以是相同的操作,所以我不理解标准中的区别。链接中提到的CWG缺陷2094应用到C++工作草案中。如果一个类型有一个volatile成员,那么它就很容易被复制-请参阅或etc“volatile成员是原子更新的”标准中没有要求
volatile
值是原子更新的。您可以在
volatile
值上进行数据竞争。@Nicolas是的,恐怕我不太了解链接中讨论的实际“内存撕裂”问题。这可能与复制和构造的区别有关。具体地说,从一些字节缓冲区(或字节填充)初始化和复制字节缓冲区可以是相同的操作,所以我不理解标准中的区别。链接中提到的CWG缺陷2094应用到C++工作草案中。如果一个类型有一个易失性成员,那么它是可复制的——请参阅或等