传递const引用导致代码中的悖论..?

时间:2017-08-14 22:23:10

标签: c++ vector reference const

好的,所以我在一个名为vector_ref

的类中有一个函数
class vector_ref {
    public:
       int* data() const { return m_data }
       void retarget(std::vector<int> const& _t) 
       { m_data = _t.data(); 
         m_count = _t.size() }
    private:
       int* m_data;
       size_t m_count;
}

我正在尝试将vector_ref对象重新定位到名为v的现有矢量对象,该对象由int和call data()填充。

vector_ref<int> tmp;
tmp.retarget(const_cast<std::vector<int> const&>(v));
tmp.data(); // error here

传递给重新定位编译,但调用data()会产生错误:

invalid conversion from const int* to int* { m_data = v.data() ... }

这对我来说很有意义,因为成员变量m_data不是const,但是根据这个类定义,我怎么能retarget到现有的vector。如果我必须通过const引用retarget()来设置非const成员变量m_data,我怎么能希望成功编译成功重新定位的代码vector_ref实例?

1 个答案:

答案 0 :(得分:3)

只需将m_data声明为

即可
const int* m_data;

这并不意味着m_dataconst。这意味着您无法修改int指向的m_data。所以你仍然可以这样做:

m_data = _t.data();

但你不能这样做:

*m_data = x;
m_data[5] = y; // or this

顺便说一句,您不需要const_cast。如果要删除const限定符(即将const_cast对象传递给需要非const引用的函数),则需要const。您不需要它,以便将非const对象传递给接受const引用的函数。