std::is_trivially_copyable
这两个编译器仍然不支持(至少到 gcc 4.6 为止)。但两者都提供__has_trivial_copy
做得很好的指令。
除非涉及已删除的复制构造函数。
struct A { A(A const&) =delete; };
__has_trivial_copy(A)
在 clang 中返回 1,在 gcc 中返回 0。
我正在深入研究标准,但找不到一个子句来说明当删除复制构造函数时该类是否仍然被认为是可平凡复制的。
谁是对的?
我倾向于相信海湾合作委员会是正确的,因为struct A
根本不可复制,更不用说简单的可复制了。此外,还有一个广泛的共识,即删除的复制构造函数可以被视为私有声明但未定义的构造函数,在这种情况下 gcc 仍然是正确的。
另一方面,第 9/6 节中的标准描述了不具有任何非平凡操作的平凡可复制性。我想如果你阅读了书面标准,clang 可能是对的。
libc++,clang 的原生库,支持std::is_trivially_copyable<T>
事实上,在你的例子中假装该类型是可以简单复制的,尽管它显然不是可以简单复制的。我认为,12.8 [class.copy] 第 12 段将删除的构造函数定义为非平凡的:
如果不是用户提供的,类 X 的复制/移动构造函数是微不足道的......
删除的声明显然是用户提供的。当我在这里说“清楚”时,我的意思是我无法立即按照将函数声明为已删除的标准来支持它算作用户提供的......
进一步调查显示,8.4.2 [dcl.fct.def.default] 第 4 段(感谢 Jesse Good 提供参考)使删除的函数非用户提供:
...一个特殊的成员函数是用户提供的如果它是用户声明的并且在第一次声明时未明确默认或删除。 ...
因此,如果没有其他原因使具有删除的复制构造函数的类确实是可平凡复制的(但这些都不适用于该类型)A
在问题中。这有点奇怪:类型 type 不能使用其复制构造函数进行复制,但它can被复制使用std::memcpy()
!我不确定这是否真的是故意的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)