我是如何误解关于“可简单复制”的C++标准的?
下面代码中的静态断言失败。
当然,我知道这是因为 Bar 中用户提供的移动构造函数。
#include <type_traits>
using namespace std;
struct Bar
{
public:
Bar() = default;
Bar(const Bar&) = default;
~Bar() = default;
Bar(Bar&&)
{
}
};
struct Foo
{
Bar b;
Foo() = default;
~Foo() = default;
Foo(const Foo&) = default;
Foo(Foo&&) = delete;
Foo & operator= (Foo && ) = delete;
Foo & operator= (const Foo & ) = delete;
};
static_assert(is_trivially_copyable_v<Foo>); // Fails
我不明白的是如何解释关于平凡可复制性的标准。来自 C++ 17 标准:
一个简单可复制的类是一个类:
(6.1) 其中每个复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符 ([class.copy], [over.ass]) 被删除或微不足道,
(6.2) 至少有一个未删除的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符,并且
(6.3) 有一个简单的、未删除的析构函数。
在我看来,Foo 符合以下标准:
6.1:除了微不足道的复制构造函数之外,它们都被删除了。Bar 也有一个平凡的复制构造函数,所以应该确保 Foo 复制构造函数是真正平凡的。
6.2:默认的复制构造函数
6.3: Foo 析构函数是默认的,Bar 也是默认的,所以析构函数应该是微不足道的。
我没有得到什么?
顺便说一句,除了更好地理解标准之外,我实际上并没有尝试做任何事情。