Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在显式实例化向量时<;someType>;,someType默认构造函数用于什么? 这是C++入门第五版的练习:_C++_Templates_Vector_Stl - Fatal编程技术网

在显式实例化向量时<;someType>;,someType默认构造函数用于什么? 这是C++入门第五版的练习:

在显式实例化向量时<;someType>;,someType默认构造函数用于什么? 这是C++入门第五版的练习:,c++,templates,vector,stl,C++,Templates,Vector,Stl,练习16.26:假设NoDefault是一个没有 默认构造函数,我们可以显式实例化向量吗? 若否,原因为何?第677页 我知道如果classNoDefault没有默认构造函数,它就不会编译,但无法解释原因。有谁能告诉我在显式实例化模板类std::vector时如何使用默认构造函数 当显式实例化std::vector时,someType默认构造函数用于什么 它用于在调整std::vector的大小时构造数组的元素。例如: std::vector<T> vector(10); std:

练习16.26:假设NoDefault是一个没有 默认构造函数,我们可以显式实例化向量吗? 若否,原因为何?第677页

我知道如果class
NoDefault
没有默认构造函数,它就不会编译,但无法解释原因。有谁能告诉我在显式实例化
模板类std::vector
时如何使用默认构造函数

当显式实例化std::vector时,someType默认构造函数用于什么

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

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

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

C++11引入了一个新的构造函数,
vector(size\u type n)
,并且“显然”该构造函数不能实例化,除非
value\u type
是默认可构造的。它是C++03中的
向量(size_type n,const T&=T(),const Allocator&alloc=Allocator())
,但他们将其更改为两个独立的构造函数。
resize()
也做了类似的更改

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

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


因此,我非常确定更改是阻止
vector
在C++11中显式实例化的原因(我认为分配器类型也需要是默认可构造的)。但我可能错过了什么。考虑到这种向后的不兼容性,做出这样的改变似乎有点奇怪。如果你想知道一个更深层次的原因,为什么它不再有效,而不是为什么它不起作用,那么可能有一个建议可以证明这一点:-)

正如前面所说的,创建对象向量需要默认构造函数。但是,如果要创建一个经典的动态数组(内存的连续区域),则可以使用新语法解决缺少默认构造函数的问题:

#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;
}
#包括
结构Foo{
显式Foo(inta):a(a){
INTA;
};
int main(){
void*mem=新操作符[](10*sizeof(Foo));
Foo*ptr=静态(mem);
对于(int i=0;i<10;++i){
新的(&ptr[i])Foo(i);

std::我是否认为向量的容量只是一种为其“预分配”空间的方法,它是否使用默认构造函数初始化元素?谢谢,现在它是有意义的。调整大小就是这样工作的。答案中应该明确,它似乎是“保留”的还需要默认值constructor@SteveJessop,如何在不调整内部数组大小的情况下保留空间?@Jeffery:它调用分配器上的
allocate()
函数以获取原始空间,然后多次调用
construct()
以复制构造(在C++03中)或移动构造(在C++11中)从旧的缓冲区到新的缓冲区,有许多元素等于
size()
。你说得对,我看错了部分。类型不需要是默认可构造的。