在显式实例化向量时<;someType>;,someType默认构造函数用于什么? 这是C++入门第五版的练习:
练习16.26:假设NoDefault是一个没有 默认构造函数,我们可以显式实例化向量吗? 若否,原因为何?第677页 我知道如果class在显式实例化向量时<;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:
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()
。你说得对,我看错了部分。类型不需要是默认可构造的。