C++中max_size()是否可能存在未定义行为?
关于C++标准中
max_size()定义的歧义分析 C++标准中对max_size()的定义如下:
返回值:最大可能容器的
distance(begin(), end())。
- 出自[container.reqmts]中的
max_size条款
初看这个定义没有问题,而且标准里没有为max_size()设置“前置条件”章节。但需要注意的是,对于随机访问迭代器,std::distance的实现逻辑是返回(last - first),而随机访问迭代器的减法操作b - a是有明确前置条件的——不满足条件时该操作会导致未定义行为。
针对标准的表述,我们可以有三种解读方向:
max_size()无前置条件,因此尽管标准未明确说明,但隐含要求最大可能容器的max_size()必须保证distance(begin(), end())的调用是定义良好的。max_size()只是缺失了“前置条件”章节的描述,如果end() - begin()(以及对应的std::distance(begin(), end()))属于未定义行为,那么max_size()的结果也可能是未定义行为。- 其他未考虑到的情况。
核心疑问在于:
标准中缺少
max_size()的“前置条件”章节,是对实现方提出的隐含要求,还是单纯的编辑疏漏?
目前这个问题没有明确的官方答案。std::distance基于(last - first)定义,后者可能触发未定义行为,但std::distance本身也并未要求迭代器的差值必须是可表示的。另外,“&b - &a是未定义行为但std::distance(&a, &b)定义良好”这种情况显然不符合逻辑。
基于以上分析,我认为这属于标准的编辑疏漏:max_size()确实缺失了必要的前置条件描述,存在触发未定义行为的可能,但也不排除还有未考虑到的细节点。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

