2017-08-14 18 views
-4

确定,所以我有一个名为vector_ref传递const引用导致代码中的悖论..?

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和调用数据类中的一个函数()。

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

进行重新定位编译通,但呼叫数据()得到错误:

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

这对我来说很有意义,因为成员变量m_data不是const,但鉴于这个类定义我怎么能retarget到现有的vector。如果我必须通过const参考retarget(),其中设置了非const成员变量m_data,我怎么能希望成功地编译成功重定向vector_ref实例的代码?

+1

你的意图是什么?通过将一个参数作为const&',你声明你不会改变它,但是你想要一个可变的指针指向它,表明你可以通过该指针来改变它。 – Justin

+0

我正在从别人的项目中读取代码,试图找出为什么他们这样写。 – jojeyh

回答

3

只是声明m_data作为

const int* m_data; 

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

m_data = _t.data(); 

但你不能做到这一点:

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

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