我有一个简单的数据结构,称为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 range
或 range
并没有什么区别。
第二。 auto r = array.all();
创建 all
返回的任何内容的拷贝。你的 r 是一个非常量对象,并且使用了非常量 forEach
。但由于迭代器在第二个版本中是 const,因此您无法修改迭代器。
关于c++ - C++ 中常量的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35949055/