确实可以复制,这意味着不可复制

Does being trivially copyable imply being nothrow copyable?

本文关键字:意味着 可复制 复制      更新时间:2023-10-16

另外,还有一个可以投掷的copy构造函数的类型示例,但仍然很琐碎?如果不是,这是否意味着is_nothrow_copy_constructible_v<T>应在is_trivially_copy_constructible_v<T>为true时是正确的?

请注意,根据标准(最新草稿[23.15.4.3]),要使T型不可复制,我们需要表达式T t(declval<const T&>());是一个形式良好的可变定义任何例外。这个措辞对我来说似乎有些危险 - 对于而言,这意味着什么?noexcept指数是否足以建立知识?或者也许将确定保留给实施?


编辑:我意识到,在微不足道的复制和易于复制的构造之间存在区别。我的重点是后者。

难以复制的是不可复制吗?

否。例如:

struct X {
    X(X&& ) = default;
    X(X const& ) = delete;
};

这种类型在可复制的上是微不足道的,但根本不可复制。


但是,给定,一种类型是可复制的&Dagger; > 琐碎的可复制,那么它必须无需投掷即可复制(任何潜在的例外都会必须来自不存在的非平凡副本)。

&Dagger; 简单地默认复制构造函数,但对其进行标记noexcept(false)将其定义为已删除,因此这种类型是不可复制的。

在实现dr2171的编译器上:

struct X {
    X(X&) = default;
    template<class U> X(U&&){ throw 1; }
};
static_assert(std::is_trivially_copyable_v<X>, "");
static_assert(std::is_copy_constructible_v<X>, "");
static_assert(!std::is_nothrow_copy_constructible_v<X>, "");
static_assert(!std::is_trivially_copy_constructible_v<X>, "");