为什么 std::string::max_size 不是编译时常量?
Why isn't std::string::max_size a compile-time constant?
std::string
提供了一种max_size()
方法,以确定它可以包含的最大元素数量。
但是,要计算出字符串的最大长度,程序员必须创建一个(可能为空的)字符串对象。
如果此类不需要程序员的任何信息,为什么max_size()
不作为编译时常数可用?是否需要某种运行时信息来计算其最大尺寸?
一个原因是max_size
功能根本不是很有用,委员会认为尝试修复它是不值得的。因此,它只是离开的方式,因为它是已记录的接口的一部分。
请参阅图书馆缺陷报告#197:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197
max_size()对很多事情都没有用,并且对于麦克斯_size()可以使用的少数情况,现有措辞就足够清楚了。更改现有措辞的尝试都没有改进。
std::string::max_size()
在引擎盖下调用 std::allocator::max_size()
。
根据标准,20.9.6.1.10:
size_type max_size() const noexcept;
返回:呼叫分配(n,0)可能成功的最大值n。
(另请参见:分配器:: max_size)
从理论上讲,分配器实现可能能够通过SYSCALL分配的一块内存的最大大小。这将有助于确定特定过程内的字符串最大尺寸。
对max_size()
的调用委派给了用于容器的分配器。
从理论上讲,非常聪明的分配器可以在运行时计算其max_size
,例如取决于可用的RAM。
这也应该有效:
enum : std::string::size_type {
npos = std::string::size_type(-1),
max_size = npos - 1
};
相关文章:
- C++常量数组的编译时间较长
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 如何在常量计算表达式中获取编译时错误?
- 如何在编译时解析静态常量 std::string?
- 有没有办法在类实例中存储编译时常量?
- 检测编译时文本和常量
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- Constexpr 类采用常量引用不编译
- 为什么对数组的常量左值引用不编译在下面?
- 由于缺少常量而出现编译错误
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 不是 VS2017 中的编译时常量表达式
- 将编译时定义大小的数组初始化为常量表达式
- 将大小为编译时常量的数组初始化为单个值
- 如何为 std::array 声明全局编译时常量?
- 返回非常量引用编译的 Const 方法
- 常量正确性编译错误到模板函数中的无效转换错误