2

如果我有一堂课,说,

class Car {
  public:
    void Drive();
    void DisplayMileage() const;
};

我基于这个类创建了一个共享指针,

typedef boost::shared_ptr<Car> CarPtr;

然后我继续填充 CarPtrs 的向量,

std::vector<CarPtrs> cars...;

我现在想遍历向量并做一些事情:

for(auto const &car : cars) {
   car->DisplayMileage(); // I want this to be okay
   car->Drive(); // I want the compilation to fail here because Drive isn't const.
}

如果不将指向汽车的共享指针转换为指向 const car 的共享指针,这是否可能?

4

2 回答 2

8

听起来像是Boost.Range “间接”适配器的一个很好的用例:

for(auto const& car : cars | boost::adaptors::indirected) {
  car.DisplayMileage();
  car.Drive(); // error: passing 'const Car' as 'this' argument of 'void Car::Drive()' discards qualifiers [-fpermissive]
}

工作演示代码在这里

于 2013-04-26T19:38:24.867 回答
2

如果不将指向汽车的共享指针转换为指向 const car 的共享指针,这是否可行?

不,这是不可能的。应用于共享指针,而const不是它所指的东西。

这是间接的一个基本事实,指针也一样:

int main()
{
   int x = 0;
   int* p1 = &x;
   auto const p2 = p1;

   // p2 is `int* const`, not `int const*`
   *p1 = 1;
}

不幸的是,根本没有办法在迭代中固有地获得不变性,但那是因为你使用了间接:你没有迭代Cars。

于 2013-04-26T19:25:19.397 回答