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