是否仍然需要提供默认构造函数来使用 STL 容器?

Is there still a need to provide default constructors to use STL containers?

我记得在 C++98 中,如果你想制作 MyClass 的 STL 容器,你需要为 MyClass.

提供默认构造函数

这是否特定于 STL 的某些实现?还是标准强制要求的?

因为在没有意义的情况下提供默认构造函数不是一个好习惯...

当然,我不是谈论像

这样的电话
vector<MyClass> v(6);  

您明确要求创建 6 个默认初始化的对象...

此引述来自 Bjarne Stroustrup 的 C++ 编程语言,特别版,2005 第 16.3.4 节:

If a type does not have a default constructor, it is not possible to create a vector with elements of that type, without explicitly providing the value of each element.

所以这确实是一个标准要求。还要求(第 17.1.4 节):

To be an element of a container, an object must be of a type that allows the container implementation to copy it. The container may copy it using a copy constructor or an assignment; in either case the result of the copy must be an equivalent object.

所以是的,有“官方”构造函数要求,库实现应该是可互换的,而不是添加其他要求。 (已经在 first proposal for STL in 1995 中,作者尽可能地尝试清楚地指示规范并缩小依赖于实现的灵活性。)

因此,在您声明其他构造函数的情况下,您必须提供一个默认构造函数:

If a user has declared a default constructor, that one will be used; otherwise, the compiler will try to generate one if needed and if the user hasn't declared other constructors.

现在,这个requirement is relaxed。从 C++11 开始:

The requirements that are imposed on the elements depend on the actual operations performed on the container.

所以你可以为 class 定义一个没有默认构造函数的向量,如果它没有意义的话。例如,这非常有效 (online demo):

class MyClass {
public: 
    MyClass(int x) {}
};
int main() {
    vector<MyClass> v; 
    MyClass test{1}; 
    v.push_back(test);
}

但它仅在您不使用任何需要默认构造函数的操作时有效。例如 v.resize(6); 将无法编译。