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

标签 c++ vector c++11 constants

容器要求已从 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/

相关文章:

c++ - 模型中的 Qt 模型?

c++ - 如何修剪 std::string?

arrays - 如何合并两个元胞数组的数据?

C++ 如何将 char 数组转换为字节 vector (vector<byte>)

c++ - 数组指针,(*ptr)[] 和 *ptr[] 有什么区别

c++ - 在 C++ 中分离模板接口(interface)和实现

c++ - 默认智能设备项目找不到依赖项

c++ - 为什么这不访问 vector 位置?

c++ 抛出 'std::length_error' 的实例

C++二维数组定义