在显式实例化向量时<someType>,someType 默认构造函数的用途是什么?

While explicitly instantiating vector<someType>, what is the someType default constructor used for?

本文关键字:someType 构造函数 默认 是什么 gt 向量 lt 实例化      更新时间:2023-10-16

这是 c 底漆5th Edition 的练习:

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

我知道如果NoDefault类没有默认构造函数,但不能解释原因。谁能告诉我如何在明确实例化template class std::vector<NoDefault>时使用默认构造函数?

c 11介绍了一个新的构造函数vector(size_type n)和"明显"该构造函数,除非value_type默认可构造,否则无法实例化该构造函数。它是C 03中的vector(size_type n, const T & = T(), const Allocator& alloc = Allocator()),但它们将其更改为两个独立的构造函数。对resize()进行了类似的更改。

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

在C 03中,仅默认参数使用默认构造。您可以明确实例化模板,但是您将无法在不提供该参数的值的情况下调用这些功能。

因此,我很确定更改是防止vector<NoDefault>在C 11中明确实例化的内容(而且我想分配类型也需要默认可构造)。但是我可能错过了一些东西。鉴于它引入了这种向后的不相容性,进行这种变化似乎有些奇怪。如果您想要更深层的理由,那么可能会有一个建议可以证明这一点是合理的,为什么此不再有效,而不是为什么此不工作的原因: - )

明确实例化 std::vector<someType>时,使用的默认构造函数是什么?

调整std::vector的大小时,用于构造数组的元素。例如:

std::vector<T> vector(10);

将默认构造T类型的10个元素。

如前所述,默认构造函数需要创建对象的向量。但是,如果要创建一个经典的动态阵列(内存的连续区域),则可以使用该位置新语法解决缺乏默认构造函数:

#include <iostream>
struct Foo {
    explicit Foo(int a): a(a) {}
    int a;
};
int main() {
    void* mem = operator new[](10*sizeof(Foo));
    Foo* ptr = static_cast<Foo*>(mem);
    for (int i = 0; i < 10; ++i ) {
        new(&ptr[i])Foo(i);
        std::cout << ptr[i].a;
    }
    return 0;
}