Компиляторы порой полны сюрпризов и в ходе разработки случались такие странные ошибки, что хотелось перечислить самое веселое для читателей’ развлечение.
VC8:
template <class StateType>
typename ::boost::enable_if<
typename ::boost::mpl::and_<
typename ::boost::mpl::not_<
typename has_exit_pseudo_states<StateType>::type
>::type,
typename ::boost::mpl::not_<
typename is_pseudo_exit<StateType>::type
>::type
>::type,
BaseState*>::type
Я получаю следующую ошибку:
ошибка C2770: недействительный явный аргумент шаблона для «глобального пространства имен»::boost::enable_if<...>::... "
Если я сейчас удалю первый “::” в ::boost:::mpl, компилятор закроется. Таким образом, в этом случае невозможно следовать рекомендациям Boost & #8217.
VC9:
Это мое любимое время’. Знаете ли вы, почему псевдосостояния выхода упоминаются в таблице переходов с помощью а “submachine::exit_pt”? Потому что “exit” разрушит компилятор. “Exit” также невозможно, потому что он разрушит компилятор на одной машине, но не на другой (компилятор был установлен с того же диска).
Иногда удаление политики приводит к сбоям компилятора, поэтому некоторые версии определяют фиктивную политику под названием WorkaroundVC9.
Тип: В то время как g++ и VC9 компилируют & #8220; Standard & #8221; машины состояния в сопоставимые времена, Typeof (при поддержке обоих способов) ведет себя квадратично с VC9 и VC10.
eUML: в случае сбоя компилятора изменение порядка определений состояния (первые состояния без входа или выхода) иногда решает проблему.
g++ 4.x: Скучный компилятор, почти все работает почти так, как ожидалось. Будучи не юристом по языку, я не уверен в следующем “Typeof problem”. VC9 и g++ расходятся во мнениях по вопросу о том, можно ли вывести BOOST_ Тип TYPEOF генерируется без предварительного определения типдефа. Буду благодарен за ответ на этот вопрос. Я нашел только два способа взлома компилятора:
Добавьте больше конструкций eUML, пока что-то не взорвется (особенно с g++-4.4)
Функция build_terminate использует 2 mpl::push_back вместо mpl::insert_range, потому что g++ не принимает вставку_range.
Вы можете протестировать реализацию деклатипа компилятора’s с помощьюследующего стресс-тестаи повторно активировать комментируемый код до сбоя компилятора.