Boost :: asio что это за странный стиль кодирования?

Я собираюсь отладить что-то в моем сокете boost asio И нашел этот фрагмент кода внутри библиотеки asio (находится в boost / asio / impl / write.hpp, строка 169 (boost 1.47)):

  switch (start)
  {
    case 1:
    buffers_.prepare(this->check_for_completion(ec, total_transferred_));
    for (;;)
    {
      stream_.async_write_some(buffers_,
          BOOST_ASIO_MOVE_CAST(write_op)(*this));
      return; 
    default:
      total_transferred_ += bytes_transferred;
      buffers_.consume(bytes_transferred);
      buffers_.prepare(this->check_for_completion(ec, total_transferred_));
      if ((!ec && bytes_transferred == 0)
          || buffers_.begin() == buffers_.end())
        break;
    }

    handler_(ec, static_cast<const std::size_t&>(total_transferred_));
  }

У меня уже много лет опыта разработки C / C ++, но никогда в жизни я не видел такой странной реализации. Посмотрите, метка default: оператора switch находится внутри цикла for.

Если я правильно понимаю, тогда оператор switch "неправильно используется" вместо a goto, правильно (для случаев, когда start! = 1, goto default :)? Действительно ли это действительный C / C ++ по отношению к стандарту? Что произойдет, если я, например, поместите

for(int i=0; i < 10; i++)

вместо цикла for в исходном коде. Будет ли «i» неопределенным в случае, если выполняется переход по умолчанию: label? Конечно, я мог бы использовать здесь отладчик, однако это кажется мне настолько подозрительным, что я думаюэто может привести к разному поведению разных компиляторов.

8
задан Charles 6 December 2013 в 22:08
поделиться