首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::std::initializer_list ()和std::end()在C++11中重载?

为什么std::std::initializer_list ()和std::end()在C++11中重载?
EN

Stack Overflow用户
提问于 2014-08-09 05:44:01
回答 1查看 655关注 0票数 11

在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)指定这些重载。那么,为什么要提供这些超载呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-09 06:02:09

这一点在N2930中得到了解释,它建议进行更改以添加相关的重载。强调地雷:

拟议变动摘要

  • 指定基于范围的语句,而不使用概念,使用依赖于参数的开始和结束查找(始终包括名称空间beginend函数std中的这些函数)来为序列的开始和结束提供迭代器。
  • 为语句<iterator>**.**指定基于范围的,以便数组和初始化程序列表不依赖于
  • 重构<initializer_list>,使其不依赖于其他标头,也不包含其他标头。
  • 指定#include <initializer_list>的库标头。

他们似乎没有解释为什么他们希望<initializer_list>不依赖<iterator>,但我认为一个合理的猜测是前者应该在独立的实现中可用,而后者可能不是(表16,第17.6.1.3节)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25215590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档