C 11 是否允许 vector<const T>?

新手上路,请多包涵

容器要求已从 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 许可协议

阅读 457
1 个回答

不,我相信分配器要求说 T 可以是“非常量,非引用对象类型”。

您将无法使用常量对象的向量做很多事情。而且 const vector<T> 无论如何都会几乎相同。


许多年后,这个快速而肮脏的答案似乎仍然吸引着评论和投票。并不总是向上。 :-)

所以要添加一些适当的参考:

对于我在纸上的 C++03 标准,[lib.allocator.requirements] 部分中的表 31 说:

T, U any type

并不是说 任何 类型都有效。

因此,下一个标准 C++11 在 [allocator.requirements] 和现在的表 27 中的草稿 中说:

T, U, C any non-const, non-reference object type

这与我最初凭记忆在上面写的非常接近。这也是问题所在。

但是,在 C++14( 草案 N4296 )中,表 27 现在说:

T, U, C any non-const object type

可能是因为引用毕竟不是对象类型?

现在在 C++17( 草案 N4659 )中,表 30 显示:

T, U, C any cv-unqualified object type (6.9)

所以不仅排除了 const ,而且 volatile 。无论如何可能是旧消息,只是一个澄清。


另请参阅 Howard Hinnant 的第一手资料,目前就在下方。

原文由 Bo Persson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题