在C++11 (引用N3337)中,std::begin()和std::end()被指定为(§24.7 iterator.range/p2-3)
模板自动开始( C& c) ->解密类型(c.begin());模板自动开始(const& c) ->解密类型(c.begin()); 2返回:
c.begin()。 模板自动终止( C& c) ->解密类型(c.end());模板自动结束(const& c) ->解密类型(c.end()); 3返回:c.end()。
然而,std::initializer_list为这些函数提供了自己的重载(第18.9.3节support.initlist.range):
模板const * begin(initializer_list il) il除外; 1返回:
il.begin()。 模板const * end(initializer_list il) il除外; 2返回:il.end()。
看起来这些重载除了(1)有一个noexcept规范和(2)按值获取它们的参数之外,没有做任何其他事情。但是,复制initializer_list并没有什么特别之处(它只是复制一对指针或同样轻量级的东西),因此(2)在行为上没有什么区别。此外,许多标准容器的begin()和end()成员函数也是noexcept,但是没有为这些容器指定std::begin()/std::end()的重载,因此委员会似乎不太可能仅仅为(1)指定这些重载。那么,为什么要提供这些超载呢?
发布于 2014-08-09 06:02:09
这一点在N2930中得到了解释,它建议进行更改以添加相关的重载。强调地雷:
拟议变动摘要
begin和end函数std中的这些函数)来为序列的开始和结束提供迭代器。<iterator>**.**指定基于范围的,以便数组和初始化程序列表不依赖于<initializer_list>,使其不依赖于其他标头,也不包含其他标头。#include <initializer_list>的库标头。他们似乎没有解释为什么他们希望<initializer_list>不依赖<iterator>,但我认为一个合理的猜测是前者应该在独立的实现中可用,而后者可能不是(表16,第17.6.1.3节)
https://stackoverflow.com/questions/25215590
复制相似问题