从C++03到C++11,容器的要求发生了变化。C++03有一般性的要求(例如对于向量需要复制构造和赋值构造),而C++11对每个容器操作定义了细粒度的要求(第23.2部分)。
因此,您现在可以将一种可复制构造但不可赋值的类型存储在vector中,例如具有const成员的结构体,只要您仅执行不需要赋值的某些操作(例如构造和push_back)。但是,insert操作则不行。
我的疑问是:这是否意味着标准现在允许vector<const T>
?我没有看到任何不允许的理由- const T
就像具有const成员的结构体一样,是可复制构造但不可赋值的类型- 但我可能错过了什么。
(让我怀疑自己是否错过了什么的部分是:如果您尝试实例化vector<const T>
,gcc trunk会崩溃,但是对于具有const成员的T,vector<T>
可以正常工作。)
vector<const T>
:https://gcc.godbolt.org/z/71PPjcxsa - Fedor