C++ 如果没有将默认类构造函数传递给std::vector分配器,则只调用一次分配器

C++ 如果没有将默认类构造函数传递给std::vector分配器,则只调用一次分配器,c++,vector,C++,Vector,基本上我有以下类代码: class Foo { public: Foo() { instructions }; Foo(int a) { instructions }; Foo(int a, int b) { instructions }; } 这一个用作std::vector对象的基本类型,但是,如果我使用默认的Foo分配器分配并初始化一个新的向量,那么该向量将被x个不同的Foo对象填充。因此,下面一行: std::vector<Foo> bar =

基本上我有以下类代码:

class Foo {

public:
    Foo() { instructions };
    Foo(int a) { instructions };
    Foo(int a, int b) { instructions };

}
这一个用作std::vector对象的基本类型,但是,如果我使用默认的Foo分配器分配并初始化一个新的向量,那么该向量将被x个不同的Foo对象填充。因此,下面一行:

std::vector<Foo> bar = std::vector<Foo>(1337);
std::vector bar=std::vector(1337);
生成1337个不同的Foo对象

当我使用第二个或第三个构造函数时,会发生奇怪的行为。事实上,在这种情况下:

std::vector<Foo> bar = std::vector<Foo>(1337, Foo(1, 2));
std::vector bar=std::vector(1337,Foo(1,2));
填充了相同的元素。最后,
bar
只是一个包含1337个相同对象的向量


我遗漏了什么吗?

第一个变量创建了
1337
默认构建的
Foo
实例的向量。第二个创建了一个向量,其中包含
1337
实例,所有实例都是用双参数构造函数构造的。每个对象仍然是不同的对象,但它们的构造方式相同。您可能想阅读,例如。另外,如何检查两个
Foo
对象是否不同或相同?第二个版本应调用
Foo(1,2)
一次,然后使用复制构造函数对其进行
1337
复制。参见第页的构造函数#2我并不是在实际检查对象是否相同,而是通过在构造函数中添加printf,我注意到vector(10)调用printf 10次(因此构造函数被称为10次不同的次数)和vector(10,Foo(1,2)只调用一次构造函数,但我需要的是第二个构造函数的第一个行为创建一个复制构造函数并登录该构造函数。也许向量只直接创建一个对象,然后将其复制X次?