【发布时间】:2016-03-11 20:11:06
【问题描述】:
我有一个名为array 的简单数据结构(类似于std::array)。 array 类具有称为 all() 的方法。以下是方法声明:
const range<const_type_pointer> all() const;
range<type_point> all();
range 是类模板,由两个迭代器构造。这是range类声明的简化版:
template <typename Iterator>
class range {
typedef typename iterator_traits<Iterator>::type_value type_value;
typedef typename iterator_traits<Iterator>::type_reference type_reference;
typedef typename iterator_traits<Iterator>::type_pointer;
range(Iterator begin, Iterator end);
// methods & algorithms
// data members
mutable Iterator _begin;
mutable Iterator _end;
};
所以基本上,如果我在const array 对象上调用所有方法,它应该调用const 方法的重载并返回const range。现在,在我的算法部分,我有以下签名的简单算法:
template <typename UnaryFunction>
range forEach(UnaryFunction function);
然后我尝试了以下测试:
void test1(const array<int, 10>& array)
{
auto r = array.all();
r.forEach([](int i) { std::cout << i << " "; });
}
第二个:
void test2(const array<int, 10>& array)
{
auto r = array.all();
r.forEach([](int& i) { ++i; });
}
在第一种情况下,我只是打印变量i,编译器没有抱怨,即使我在const range 对象上调用了非const range 方法。在第二种情况下,编译器抱怨。这种行为标准符合吗?
作为编译器,我使用的是 MSVS 编译器。
【问题讨论】:
-
作为旁注:不要返回
const T(非参考)。它会引发细微的错误,并且不能解决任何问题。在你的情况下返回range<const_type_pointer> -
例如 r.forEach([](int i) { std::cout
标签: c++ const-correctness