如何使用begin()自由函数

How to use begin() free function

本文关键字:自由 函数 何使用 begin      更新时间:2023-10-16

我目前正在编写一个处理通用容器的函数模板。由于这个问题中提到的原因,我想使用std::begin()std::end()。我的问题是,我是否应该使用:

std::begin( myContainer )

或者:

using namespace std; // Better use: "using std::begin"
begin( myContainer )

或者,换句话说,可以在std命名空间中重载begin()吗?我是否应该允许我的函数的用户也在其他地方重载全局命名空间中的begin()函数?STL是如何处理的?

不需要using指令,所以我们假设第二个代码段包含using声明。

using std::begin;

如果您要创建自己的容器来使用此函数模板,请提供Container::begin()Container::end()成员函数,然后无论使用第一个还是第二个都没有区别。std::begin()std::end()将在可用时调用各自的成员函数(§24.7[iterator.range])。

另一方面,如果您正在创建一个应该与任何容器、标准库中的容器或自定义容器一起使用的函数模板;我推荐第二种方法。

using std::begin;
begin( myContainer );

请注意,这将使ADL能够在与容器定义相同的命名空间中查找免费函数begin()end()的用户定义重载。重载不应添加到命名空间std或全局命名空间(除非容器定义也在全局命名空间中)。在没有这些自由函数重载的情况下,std::begin将被调用(因为using declaration),而这又将调用Container::begin()

std命名空间中重载某些内容是不好的,只允许进行专门化。如果你想启用ADL,你可以使用

using std::begin;
begin(myContainer)

对于自定义容器,std::begin实际上可以在容器中调用begin。所以如果你有MyContainerClass::begin就足够了。与std::end以及常量迭代器版本std::cbeginstd::cend相同。