C++ 我可以为equal_range()的返回值专门化std::begin和std::end吗?
C++ 我可以为equal_range()的返回值专门化std::begin和std::end吗?,c++,c++11,stl,iterator,template-specialization,C++,C++11,Stl,Iterator,Template Specialization,但我想知道,这样做的坏处是什么?有更好的方法吗 强> 7.64.2.1/1 ,如果将命名空间 STD>代码>或命名空间添加声明或定义,则C++程序的行为是未定义的。 除非另有规定,否则在命名空间std中。程序可以添加 任何标准库模板到命名空间的模板专门化 std仅当声明取决于用户定义的类型和 专业化满足 原始模板,并没有明确禁止 是的,我相信,从技术上讲,您的代码表现出未定义的行为。也许您可以编写一个简单的类,在其构造函数中使用一对迭代器并实现begin()和end()方法。然后你可以写一些像
但我想知道,这样做的坏处是什么?有更好的方法吗
<>强> 7.64.2.1/1 ,如果将命名空间<代码> STD>代码>或命名空间添加声明或定义,则C++程序的行为是未定义的。
除非另有规定,否则在命名空间std
中。程序可以添加
任何标准库模板到命名空间的模板专门化
std
仅当声明取决于用户定义的类型和
专业化满足
原始模板,并没有明确禁止
是的,我相信,从技术上讲,您的代码表现出未定义的行为。也许您可以编写一个简单的类,在其构造函数中使用一对迭代器并实现begin()
和end()
方法。然后你可以写一些像
for (const auto& elem: as_range(equal_range(...))) {}
如果涉及用户定义的类型,那么允许它的部分到底有多“挑剔”?该对包含迭代器,迭代器在我的用户定义类型的唯一容器上进行迭代。这些模板最终可能会用用户定义的类型实例化,但这并不重要。在任何情况下,“依赖于用户定义的类型”转义图案填充仅适用于模板专门化。你的不是:它们是主函数模板,只是碰巧重载了同名的其他函数模板。只需添加,模板专门化例外就是允许我们专门化std::hash
。
for (const auto& elem: as_range(equal_range(...))) {}