How*_*ant 17
有两个vector<T>成员需要T在C++ 11中使用默认构造:
explicit vector(size_type n);
void resize(size_type sz);
Run Code Online (Sandbox Code Playgroud)
没有别的.因此,如果您使用这些签名,则需要具有默认的可构造类型,否则您不需要.
jua*_*nza 14
C++ 03中的要求是存储在容器中的类型CopyConstructible和Assignable(参见§23.1容器要求).但是,在C++ 11中,这些要求是放宽的,并且倾向于应用于对容器执行的操作.因此,简单的默认构造没有要求(参见C++ 11标准中的teble 96,§23.1).
当您尝试复制的载体,或插入元素融入它,你会遇到CopyInsertable,CopyAssignable,EmplaceConstructible,MoveInsertable,MoveAssignable等方面的要求
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方法.
| 归档时间: |
|
| 查看次数: |
2882 次 |
| 最近记录: |