容器要求已从 C++03 更改为 C++11。虽然 C++03 有全面的要求(例如,向量的复制可构造性和可分配性),但 C++11 对每个容器操作定义了细粒度的要求(第 23.2 节)。
因此,只要您只执行不需要赋值的某些操作(构造和 push_back
是这样的操作; insert
不是)。
我想知道的是:这是否意味着标准现在允许 vector<const T>
?我看不出它不应该有任何理由 - const T
就像具有 const 成员的结构一样,是一种可复制构造但不可分配的类型 - 但我可能错过了一些东西。
(让我觉得我可能错过了一些东西的部分原因是,如果您尝试实例化 vector<const T>
,gcc 主干会崩溃并烧毁,但 vector<T>
,其中 T 有一个 const 成员)。
原文由 HighCommander4 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,我相信分配器要求说 T 可以是“非常量,非引用对象类型”。
您将无法使用常量对象的向量做很多事情。而且
const vector<T>
无论如何都会几乎相同。许多年后,这个快速而肮脏的答案似乎仍然吸引着评论和投票。并不总是向上。 :-)
所以要添加一些适当的参考:
对于我在纸上的 C++03 标准,[lib.allocator.requirements] 部分中的表 31 说:
并不是说 任何 类型都有效。
因此,下一个标准 C++11 在 [allocator.requirements] 和现在的表 27 中的草稿 中说:
这与我最初凭记忆在上面写的非常接近。这也是问题所在。
但是,在 C++14( 草案 N4296 )中,表 27 现在说:
可能是因为引用毕竟不是对象类型?
现在在 C++17( 草案 N4659 )中,表 30 显示:
所以不仅排除了
const
,而且volatile
。无论如何可能是旧消息,只是一个澄清。另请参阅 Howard Hinnant 的第一手资料,目前就在下方。