在显式实例化vector <someType>时,someType默认构造函数用于什么?

Yue*_*ang 4 c++ templates stl vector

这是C++ Primer第5版的练习:

练习16.26:假设NoDefault是一个没有默认构造函数的类,我们可以显式实例化vector<NoDefault>吗?如果没有,为什么不呢?P.677

我知道如果类NoDefault没有默认构造函数,它就不会编译,但无法解释原因.任何人都可以告诉我在显式实例化时如何使用默认构造函数template class std::vector<NoDefault>

Ste*_*sop 6

C++ 11引入了一个新的构造函数,vector(size_type n)并且"显然"构造函数无法实例化,除非它value_type是默认构造的.它是vector(size_type n, const T & = T(), const Allocator& alloc = Allocator())在C++ 03中,但是它们将它改为两个独立的构造函数.做了类似的改变resize().

在GCC中,据我所知,根据标准:vector模板至少可以隐式实例化,而元素不是默认构造的.隐式模板类实例化仅实例化您使用的成员函数.

在C++ 03中,只有默认参数使用默认构造.您可以显式实例化模板,但如果不为该参数提供值,则无法调用这些函数.

所以我很确定更改是阻止vector<NoDefault>在C++ 11中显式实例化的(并且我认为分配器类型也需要默认构造).但我可能错过了一些东西.鉴于它引入了这种向后的不兼容性,做出这种改变似乎有点奇怪.如果你想要一个更深层次的原因,为什么这个不再起作用,而不仅仅是为什么这不起作用,那么某个地方的提案可能是合理的:-)