远程循环const引用似乎没有什么区别

fre*_*ith 4 c++ c++11

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

for(auto const &ticket : ticketStrip->tickets()) {
  ticket->ClearCalled();
}
Run Code Online (Sandbox Code Playgroud)

为什么我能够在循环内调用票证上的非const方法,例如当ClearCalled()没有标记为const时?

void Ticket::ClearCalled() { ... }
Run Code Online (Sandbox Code Playgroud)

ClearCalled确实修改了票证内部,因此不应将其标记为const.我知道我应该用

auto &ticket
Run Code Online (Sandbox Code Playgroud)

但我刚试过

auto const &ticket
Run Code Online (Sandbox Code Playgroud)

并且编译器接受了它.

票的类型是

boost::shared_ptr<AbstractMainStageTicket>
Run Code Online (Sandbox Code Playgroud)

并将一些新代码放入:

ticket->ClearCalled();
ticket.reset();
Run Code Online (Sandbox Code Playgroud)

使编译器标记复位不是const的错误.

谢谢你的帮助!

我正在使用Android的GNU 4.6工具链.

Dan*_*rey 11

从你的语法来看,它似乎ticket是一个(智能?)指针.

ticket->ClearCalled();
Run Code Online (Sandbox Code Playgroud)

这意味着类型ticket可能是类似的

const std::shared_ptr< Ticket >& ticket
Run Code Online (Sandbox Code Playgroud)

你需要的是什么

const std::shared_ptr< const Ticket >& ticket;
//                     ^^^^^
Run Code Online (Sandbox Code Playgroud)