Dan*_*ica 13 c++ containers copy-constructor noncopyable language-lawyer
如果我们有一个具有不可复制值类型的容器,这样的容器类仍然定义了复制构造函数,只是它可能不会被调用.
using T = std::vector<std::unique_ptr<int>>;
std::cout << std::is_copy_constructible_v<T>; // prints out "1" (libstdc++)
Run Code Online (Sandbox Code Playgroud)
这可能会导致"隐藏"问题,例如此处讨论的问题:Visual Studio 2017是否需要显式移动构造函数声明?.
我的问题是标准库实现是否可以将此类复制构造函数定义为有条件删除,即在不可复制的值类型的情况下删除.这对我来说是完全合理的(至少在有C++概念之前).这种实施是否符合标准?
这在数学上是不可能的,因为vector得到不完整的类型支持:
struct E {
std::vector<E> e;
};
Run Code Online (Sandbox Code Playgroud)
E是可复制的iff std::vector<E>是可复制的,如果是可复制的,std::vector<E>则E是可复制的.海龟一路下来.
甚至在此之前,因为分配器construct可以在它认为合适时破坏构造函数参数,并且容器无法判断某些东西是否是"allocator-constructible",有条件地删除拷贝构造函数需要一些严肃的设计工作.不完全类型的支持只是把钉子放在棺材里.