std :: vector适用于非默认构造的类吗?

Cub*_*bic 11 c++ stl vector c++11

我在几个地方读过std :: vector要求它的模板参数是默认的可构造的.今天我只是尝试了我的一个具有deleted默认构造函数的类,令我惊讶的是它似乎工作正常(使用std :: vector的默认构造函数).这是可移植的行为,还是这是gcc的STL的实现细节,我应该假设向量要求它的模板参数是默认的可构造的吗?

How*_*ant 17

有两个vector<T>成员需要T在C++ 11中使用默认构造:

explicit vector(size_type n);
void resize(size_type sz);
Run Code Online (Sandbox Code Playgroud)

没有别的.因此,如果您使用这些签名,则需要具有默认的可构造类型,否则您不需要.

  • 同时调用emplace_back()和emplace(const_iterator位置)[使用那些特定的签名]. (7认同)

jua*_*nza 14

C++ 03中的要求是存储在容器中的类型CopyConstructibleAssignable(参见§23.1容器要求).但是,在C++ 11中,这些要求是放宽的,并且倾向于应用于对容器执行的操作.因此,简单的默认构造没有要求(参见C++ 11标准中的teble 96,§23.1).

当您尝试复制的载体,或插入元素融入它,你会遇到CopyInsertable,CopyAssignable,EmplaceConstructible,MoveInsertable,MoveAssignable等方面的要求

  • @jrok:你错过了`vector :: resize(size_type sz)` (4认同)
  • 我可以满足所有这些,只是`DefaultConstructible`对我来说是一个问题. (2认同)

AnT*_*AnT 6

std::vector 不会无条件地要求其元素类型是默认可构造的.

std::vector(C++ 98,C++ 03)的原始规范甚至从未试图在内部默认构造其元素.所有新元素总是从"从外部"(通过调用代码)提供的对象作为参数进行复制构造.这意味着,每次你需要在你的载体缺省构造元素的时候,它是拥有默认,构造它,并将其提供给代码(主叫)的一侧std::vector为"原始"的元素被复制.

例如,当您在C++ 98中执行此类操作时

std::vector<some_type> v(42);
v.resize(64);
Run Code Online (Sandbox Code Playgroud)

它实际上扩展到了

std::vector<some_type> v(42, some_type(), allocator_type());
v.resize(64, some_type());
Run Code Online (Sandbox Code Playgroud)

通过默认参数机制.换句话说,默认构造的"原始"元素由调用代码提供给向量的构造函数,而不是由向量在内部创建.

C++ 11改变了这一点,现在std::vector有了在内部执行其元素默认构造的方法.这仍然无条件地要求向量元素是可默认构造的.它只是意味着您需要使用默认构造元素来使用这些特定std::vector方法.

  • @juanchopanza:它*是一个默认构造的实例,如上所述.关键是在预C++ 11库中,默认构造的实例*始终在*外部创建,并从*outside*作为参数提供.内部的向量默认构造*永远不会*执行.同时,在C++ 11中,可以在内部执行默认构造. (2认同)