c++ - 可以将容器的复制构造函数定义为不可复制值类型的删除吗?

标签 c++ containers language-lawyer copy-constructor noncopyable

如果我们有一个具有不可复制值类型的容器,这样的容器类仍然定义了复制构造函数,只是它可能不会被调用。

using T = std::vector<std::unique_ptr<int>>;
std::cout << std::is_copy_constructible_v<T>; // prints out "1" (libstdc++)

这可能会导致“隐藏”问题,例如此处讨论的问题:Does Visual Studio 2017 need an explicit move constructor declaration? .

我的问题是标准库实现是否可以将这样的复制构造函数定义为有条件地删除,即在不可复制的值类型的情况下删除。这对我来说很有意义(至少在有 C++ 概念之前)。这样的实现会符合标准吗?

最佳答案

vector 开始,这在数学上是不可能的。得到不完整的类型支持:

struct E {
    std::vector<E> e;
};

E如果 std::vector<E> 是可复制的是可复制的,std::vector<E>如果 E 是可复制的是可复制的。海龟一路向下。

甚至在那之前,因为分配器的 construct可以在它认为合适的时候破坏构造函数参数,并且容器无法判断某些东西是否是“分配器可构造的”,有条件地删除复制构造函数需要一些认真的设计工作。不完整的类型支持只是把钉子钉在棺材里。

关于c++ - 可以将容器的复制构造函数定义为不可复制值类型的删除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210201/

相关文章:

flutter - 如何使容器可点击,以及如何在单击时导致其他页面 flutter

c++ - 我可以使用哪个 STL 容器/算法来解决这个问题?

docker - 在 docker 中创建一个纯数据镜像

c++ - 移动构造函数的后置条件是什么?

python - 如何使用 openCV 使用广角镜头正确校准我的相机?

c++ - 针对 Linux 编译时 Assimp aiString 为空

c++ - 从 C++ 异常的构造函数中抛出异常

c++ - 如何在 C++ 中以 DLL 安全方式返回多个值?

c++ - 这是关于成员(member)访问规则的正确总结吗?

python - 我可以在 Python 类型提示中使用 __qualname__ 并推迟注释评估吗?