gpt4 book ai didi

c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?

转载 作者:可可西里 更新时间:2023-11-01 18:36:06 34 4
gpt4 key购买 nike

std::is_trivially_copyable 在这两个编译器中仍然不被支持(至少 gcc 4.6 是这样)。但是两者都提供了做得很好的 __has_trivial_copy 指令。除非涉及到已删除的复制构造函数。

struct A { A(A const&) =delete; };

__has_trivial_copy(A) 在 clang 中返回 1,在 gcc 中返回 0。

我正在研究标准,但找不到说明删除复制构造函数时类是否仍被视为可平凡复制的条款。

谁是对的?

我倾向于相信 gcc 是正确的,因为 struct A 根本不可复制,更不用说可复制了。此外,有一个广泛的共识,即删除的复制构造函数可以被视为私有(private)声明但未定义的构造函数,在这种情况下 gcc 仍然是正确的。

另一方面,第 9/6 节中的标准从没有任何非平凡操作的角度描述了平凡可复制性。我想如果您按书面方式阅读标准,clang 可能是正确的。

最佳答案

libc++,clang 的原生库,支持std::is_trivially_copyable<T>并且,实际上,在您的示例中假装该类型是可平凡复制的,尽管它显然不可平凡复制。我认为,12.8 [class.copy] 第 12 段将删除的构造函数定义为非平凡的:

A copy/move constructor for class X is trivial if it is not user-provided ...

删除的声明显然是用户提供的。当我在这里说“清楚”时,我的意思是我不能立即按照将函数声明为已删除算作用户提供的标准来支持它......

进一步调查显示 8.4.2 [dcl.fct.def.default] 第 4 段(感谢 Jesse Good 提供引用)使已删除的函数非用户提供:

... A special member function is user-provided if it is user-declared and not explicitly defaulted or deleted on its first declaration. ...

因此,如果没有其他理由使复制构造函数被删除,那么一个类确实是可复制的(但这些都不适用于问题中的类型 A。这有点奇怪:类型类型无法使用其复制构造函数进行复制,但可以使用 std::memcpy() 进行复制!我不确定这是否真的是故意的。

关于c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754886/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com