我目前正在编写一个处理通用容器的函数模板。由于上述原因,我想使用 std::begin()
和 std::end()
in this question .我的问题是,我是否应该使用:
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 声明
),这又将调用 Container::begin ()
。
关于c++ - 如何使用 begin() 自由函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21107371/