【发布时间】:2015-04-09 13:18:04
【问题描述】:
背景
我正在实现一个模板过滤迭代器。给定任何类型的开始和结束迭代器,此迭代器将遍历范围并跳过一元谓词返回 false 的任何元素。自然,我希望这个一元谓词始终有一个 const 参数,以避免谓词修改后备容器。
支持迭代器可以是任何类型和容器的迭代器。它可以是基本类型、指针、引用、类。真的什么都行。
我遇到了一个问题,我无法根据模板参数迭代器声明 std::function 以获得正确的 const 声明参数。我提炼了一个说明问题的最小代码示例。
代码
#include <vector>
#include <functional>
typedef std::vector<int*> vec_type;
typedef std::function<void(const vec_type::iterator::value_type&)> func_type;
void foo(vec_type& a, func_type f){
for (auto it = a.begin(); it != a.end(); ++it){
f(*it);
}
}
int main(int, char**){
vec_type v;
int a = 3;
int b = 4;
v.push_back(&a);
v.push_back(&b);
foo(v, [](int* x){*x = 0; });
return 0;
}
我预计 lamda 上会出现编译错误,因为 int* 应该是 const int* 但 GCC 4.8.1 和 VS2013 都允许它并愉快地修改我认为将是 const 的内容。
【问题讨论】:
-
使用
vec_type::const_iterator而不是const vec_type::iterator -
@WojciechFrohmberg 在我的情况下是不可接受的。我会添加一些背景。
-
func_type的参数类型是“const reference toint*”,而不是“reference toconst int*”。如果您将呼叫更改为foo(v, [](int*& x){x = 0; });,它将失败。 -
@molbdnilo 我怀疑发生了类似的事情。但是,如果用户忘记添加
&(如果您不阅读文档,这并不明显),那么代码将愉快地修改后备容器。您对如何解决这个问题有什么建议吗? -
[](int* x){x = 0; }- 为什么你认为这是在修改容器?
标签: c++ c++11 const-correctness