在这种情况下如何避免可变

How to avoid mutable in this case

考虑一下:

struct Foo {
    std::vector<double> x;
    mutable double* xp;
    void foo () const { xp = &(x[0]); }    
};

这不会编译因为 error: invalid conversion from 'const double*' to 'double*' [-fpermissive]

修复相当简单:

struct Foo {
    mutable std::vector<double> x;
    mutable double* xp;
    void foo () const { xp = &(x[0]); }    
};

但是如果我不想让向量可变怎么办?在这种情况下,从 const 向量获取指向非常量的指针的最佳方法是什么?

我要解决的问题如下:

我有一些代码看起来像这样(抱歉不能 post 完整的代码):

struct Foo {
    mutable DataSource data;                                   
    void load(int index) const {  data->GetEntry(index); }   
    void getX()          const { return data->element->x; }        
};

其中 DataSource 我无法更改,其 GetEntry 从文件中读取以更新其 element。以这种方式读取文件相当慢,因此我想将其更改为

struct Foo {
   mutable DataSource data;
   std::vector<DataSource::Element> elements;
   DataSource::Element* current;
   void loadAll() {  /*... read all elements into the vector ...*/ }
   void load(int index) const { current = &(elements[index]); }   
   void getX()          const { return current->x; }        
};      

因为这是我可以在不破坏(很多)现有代码的情况下做的事情。我可以完全放弃常量性,这可能是一个更好的设计,但如果可能的话我想避免这种情况,因为那样我必须在其他地方修复问题。

我们对编译器使用的一个老技巧,前一段时间没有实现 mutableconst_cast 去掉 this 对象的常量,比如:

void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }    

也非常适合您的情况。