为什么std :: string :: max_size不是编译时常量?

时间:2012-10-30 11:11:59

标签: c++ string compile-time-constant

std::string提供max_size()方法来确定它可以包含的最大元素数。

但是,为了计算字符串的最大长度,程序员必须创建一个(可能是空的)字符串对象。

如果这个类不需要程序员的任何信息,为什么max_size()不能作为编译时常量?字符串是否需要某种运行时信息来计算其最大大小?

4 个答案:

答案 0 :(得分:21)

一个原因是max_size功能根本不是很有用,委员会认为尝试修复它并不值得。所以它只是保持原样,因为它是文档化界面的一部分。

参见图书馆缺陷报告#197:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197

  

max_size()对于很多事情都没有用,现有的措辞对于max_size()可以用于的少数情况来说是足够清楚的。改变现有措辞的尝试都没有改进。

答案 1 :(得分:18)

std::string::max_size()调用了std::allocator::max_size()

根据标准,20.9.6.1.10:

  

size_type max_size() const noexcept;

     

返回:调用分配(N,0)的最大值N可能成功。

(另见:allocator::max_size

理论上,分配器实现可以计算出它可以通过系统调用分配的一块内存的最大大小。这有助于确定特定进程内字符串的最大可能大小。

答案 2 :(得分:5)

max_size()的调用被委托给用于容器的分配器。

理论上,非常智能的分配器可以在运行时计算其max_size,例如取决于可用的RAM。

答案 3 :(得分:0)

这也应该有效:

enum : std::string::size_type {
    npos     = std::string::size_type(-1),
    max_size = npos - 1
};