У меня очень простое правило синтаксического анализатора (для AX), например:
auto space = axe::r_lit(' ');
auto spaces = space & space & space;
Последняя строка компилируется и работает как положено в VC2010, но выдает странную ошибку в gcc 4.6:
parsers.cpp:68:34: error: conversion from
'axe::r_and_t<
axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>,
axe::r_char_t<char>&
>' to non-scalar type
'axe::r_and_t<
axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>&,
axe::r_char_t<char>&
>' requested
Интересно, это (известная) ошибка в gcc, и возможно ли вообще получить ошибки преобразования с объявлением auto
. Разве выведенный тип для auto
не должен всегда совпадать с типом инициализатора?
AX оператор перегрузки & вот так:
template<class R1, class R2>
r_and_t<
typename std::enable_if<
is_rule<typename std::remove_reference<R1>::type>::value, R1>::type,
typename std::enable_if<
is_rule<typename std::remove_reference<R2>::type>::value, R2>::type
>
operator& (R1&& r1, R2&& r2)
{
return r_and_t<R1, R2>(std::forward<R1>(r1), std::forward<R2>(r2));
}
Мне не удалось свести проблему к короткому тестовому случаю, к сожалению, каждый раз, когда я пытаюсь привести простой пример, он компилируется.