6

假设我们有一个不可复制的类型X

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

然后,自然地,我们不能复制具有Xas 值类型的容器:

std::set<X> v;
std::set<X> v2{v}  // error

我的问题是,涉及此类副本的表达式是否格式正确?例如,下面的表达式编译:

sizeof( std::set<X>{v} )

我在问,因为我遇到了以下问题:

std::cout << std::is_copy_constructible_v< X >;
std::cout << std::is_copy_constructible_v< std::set<X> >;

哪个打印出来01。这有点违反直觉,std::set<X>“报告”是可复制构造的,而实际上它不是(通过它的复制构造函数不能被调用)。

4

1 回答 1

0

这来自您遇到的一个问题,即您的容器应支持不完整的类型。你不能两者都做

  • 支持不完整类型
  • SFINAE 基于值类型的可复制性的特殊成员函数

如果您支持不完整的类型,则无法检查该类型是否可复制的复制构造函数的声明(因为此时它可能不完整)。因此,您始终可以实例化复制构造函数。但如果你这样做,那将在评估的上下文中失败。

有一篇很好的文章:https ://quuxplusone.github.io/blog/2020/02/05/vector-is-copyable-except-when-its-not/

于 2020-11-04T14:35:15.153 回答