如果我有课,请说,
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汽车的共享指针?
答案 0 :(得分:8)
听起来像是the Boost.Range "indirected" adaptor的一个很好的用例:
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]
}
使用演示代码here。
答案 1 :(得分:2)
这可能没有将汽车的共享指针强制转换为指向const汽车的共享指针吗?
不,这是不可能的。 const
适用于共享指针,而不适用于它引用的内容。
这是间接的基本事实,它与指针相同:
int main()
{
int x = 0;
int* p1 = &x;
auto const p2 = p1;
// p2 is `int* const`, not `int const*`
*p1 = 1;
}
可以说遗憾的是,在你的迭代中根本没有办法固有地获得不变性,但这是因为你正在使用间接:你没有迭代Car
。