c++ - C++ 中常量的正确性

标签 c++ const-correctness

我有一个简单的数据结构,称为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 rangerange 并没有什么区别。

第二。 auto r = array.all(); 创建 all 返回的任何内容的拷贝。你的 r 是一个非常量对象,并且使用了非常量 forEach 。但由于迭代器在第二个版本中是 const,因此您无法修改迭代器。

关于c++ - C++ 中常量的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35949055/

相关文章:

c++ - 为什么不允许使用静态 const float ?

c++ - 是否需要创建OpenGL情侣程序?

c++ - 容器的 const_casting 元素类型

具有 volatile 和外部数据访问的 C++ 常量正确性

c++ - 有没有办法摆脱虚拟成员函数的常量

c++ - 在 C++ 中使用 const 的正确方法是什么?

c++ - 结构初始化中的常量正确性

C++ 模板特化 : compile error: "is not a type"

java - 无法通过 QAndroidJniObject 创建 java 类

c++ - OpenCv 第一步——不存在合适的构造函数来将 "IplImage *"转换为 "cv::_InputArray"