琐碎的可复制是否意味着不可复制?

Som*_*ser 4 c++ c++17

或者,是否有一个带有复制构造函数的类型的示例可以抛出,但是仍然是微不足道的?如果没有,这是否意味着is_nothrow_copy_constructible_v<T>只要is_trivially_copy_constructible_v<T>真的应该是真的?

请注意,根据标准(最新草案 [23.15.4.3]),对于不可复制的类型T,我们需要表达式T t(declval<const T&>());是一个格式良好的变量定义,已知不会抛出任何异常.这个措辞对我来说似乎有点茫然 - 对于要知道什么意味着什么?说明者是否应noexcept足以建立知识?或者决定是留给实施的?


编辑:我意识到,通过简单的可复制和简单的可复制构造之间存在差异.我的重点是后者.

Bar*_*rry 6

琐碎的可复制是否意味着不可复制?

不.例如:

struct X {
    X(X&& ) = default;
    X(X const& ) = delete;
};
Run Code Online (Sandbox Code Playgroud)

这种类型可以轻易复制,但不能无法复制......甚至可以复制.


然而,鉴于一个类型是可复制 平凡可复制,那么它必须是没有抛出可复制(任何可能的例外是必须来自非平凡的拷贝,它可以不存在).

简单地默认复制构造函数但标记它将其noexcept(false)定义为已删除,因此这种类型不可复制.

  • 是的,Trivially Copyable的东西不一定是可复制的,这不是太棒了吗? (3认同)