容器要求已从 C++03 更改为 C++11。虽然 C++03 有全面的要求(例如 vector 的复制构造性和可分配性),但 C++11 定义了对每个容器操作的细粒度要求(第 23.2 节)。
因此,您可以例如将可复制构造但不可赋值的类型(例如具有 const 成员的结构)存储在 vector 中,只要您仅执行某些不需要赋值的操作(构造和 push_back
就是此类操作;insert
不是)。
我想知道的是:这是否意味着标准现在允许 vector<const T>
?我看不出有任何理由不应该 - const T
,就像具有 const 成员的结构一样,是一种可复制构造但不可分配的类型 - 但我可能错过了一些东西。
(让我觉得我可能错过了什么的部分原因是,如果您尝试实例化 vector<const T>
,gcc 主干会崩溃并烧毁,但使用 vector<T>
很好,其中 T 有一个 const 成员)。
最佳答案
不,我相信分配器要求说 T 可以是“非常量、非引用对象类型”。
对于常量对象的 vector ,您将无法做太多事情。还有一个 const vector<T>
无论如何都会几乎相同。
许多年后,这个快速而肮脏的答案似乎仍然吸引着评论和投票。不总是向上。 :-)
所以要添加一些适当的引用:
对于我写在纸上的 C++03 标准,[lib.allocator.requirements] 部分中的表 31 说:
T, U any type
并不是说任何类型都有效。
因此,下一个标准 C++11 说 in a close draft在 [allocator.requirements] 和现在的表 27 中:
T, U, C any non-const, non-reference object type
这与我最初根据内存在上面写的内容非常接近。这也是问题的内容。
但是,在 C++14 ( draft N4296 ) 中,表 27 现在说:
T, U, C any non-const object type
可能是因为引用毕竟不是对象类型?
现在在 C++17 ( draft N4659 ) 中,表 30 说:
T, U, C any cv-unqualified object type (6.9)
所以不仅是
const
排除,还要volatile
.反正可能是旧消息,只是澄清一下。另请参阅 Howard Hinnant's first-hand info ,目前正下方。
关于c++ - C++11 是否允许 vector<const T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61386699/