【发布时间】:2022-08-09 22:40:35
【问题描述】:
我想编写一个接受序列的通用函数,同时保证不改变所述序列。
template<typename ConstInputIter, typename OutputIter>
OutputIter f(ConstInputIter begin, ConstInputIter end, OutputIter out)
{
InputIter iter = begin;
do
{
*out++ = some_operation(*iter);
}while(iter!=end);
return out;
}
然而,上面的示例仍然可以将任何类型作为ConstInputIterator,而不仅仅是const。到目前为止,其中const 的概念是名义上的。
我如何声明给定的序列不会被这个函数改变?
-
小点:通常的约定是返回迭代器的成员函数命名为
begin()和end(),而用于遍历序列的迭代器命名为first和last。 -
在 c++20 中,它会更容易一些;在 c++17 中,在函数的 cmets 中编写一些文档。 (是的,有办法尝试确保这一点,但总的来说这是不值得的。)
-
假设迭代器将是 \"normal\" std 的,您可以将模板类型更改为容器类型,然后
begin/first将是例如typename T::const_iterator等 -
我建议该函数是否可以接受非常量迭代器并不重要,因为它无论如何都不会更改容器。我想有可能复制初始化迭代器(
InputIter iter = begin)或比较它们(iter!=end)会改变容器,但我在现实世界中还没有遇到过这样的迭代器。 -
@Peter 如果有人确实插入了非常量迭代器,编译器会发出一种通用的、难以理解的尖叫声,但这似乎通常是可以接受的。
标签: c++ iterator c++17 const-correctness