是否仍然需要提供默认构造函数来使用 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);
将无法编译。
我记得在 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);
将无法编译。