C++ 循环常数参考值的范围不为';似乎没什么不同

C++ 循环常数参考值的范围不为';似乎没什么不同,c++,c++11,C++,C++11,如果我在C++11中有一个基于范围的for循环 for(auto const &ticket : ticketStrip->tickets()) { ticket->ClearCalled(); } 为什么我能够在循环中调用票据上的非常量方法,比如ClearCalled(),而它没有标记为常量 void Ticket::ClearCalled() { ... } ClearCalled确实修改了票据的内部结构,因此不应该将其标记为const。我知道我应该使用 auto

如果我在C++11中有一个基于范围的for循环

for(auto const &ticket : ticketStrip->tickets()) {
  ticket->ClearCalled();
}
为什么我能够在循环中调用票据上的非常量方法,比如ClearCalled(),而它没有标记为常量

void Ticket::ClearCalled() { ... }
ClearCalled确实修改了票据的内部结构,因此不应该将其标记为const。我知道我应该使用

auto &ticket
但我只是试了一下

auto const &ticket
编译器接受了它

票的类型是

boost::shared_ptr<AbstractMainStageTicket>
使编译器标记重置为非常量的错误

谢谢你的帮助


我正在使用适用于Android的GNU 4.6工具链。

从您的语法来看,
ticket
似乎是一个(智能的)指针

这意味着
票证的类型可能类似于

const std::shared_ptr< Ticket >& ticket
const std::shared\u ptr&Ticket
你需要的是

const std::shared_ptr< const Ticket >& ticket;
//                     ^^^^^
const std::shared\u ptr&Ticket;
//                     ^^^^^

如果您使用
->
调用它,这意味着
ticket
是一个迭代器。所以你有一个常量迭代器,而不是常量迭代器。什么是tickets()类型?抱歉,它实际上是一个智能指针,这回答了我的问题,我可以修改智能指针指向的对象,但不能修改智能指针本身。为此,我对我处理智能指针的事实感到困惑。
const std::shared_ptr< Ticket >& ticket
const std::shared_ptr< const Ticket >& ticket;
//                     ^^^^^