Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以为equal_range()的返回值专门化std::begin和std::end吗?_C++_C++11_Stl_Iterator_Template Specialization - Fatal编程技术网

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(...))) {}