c ++ 11: преобразование типов производной типа класса enum через шаблон псевдонима

Рассмотрим следующий код, который прекрасно компилируется в clang, но не в gcc (4.7.2):

template<typename T> using remove_ref_typed =
typename std::remove_reference<T>::type; // alias-template w/ 'typename'

template<typename T> using remove_ref =
std::remove_reference<T>; // alias-template w/o 'typename'

enum class E : int { E0, E1 }; // some enum class

class C {} obj; // some non-enum class

void proof_of_concept()
{
remove_ref<C&>::type o1 = obj; // ... gcc ok
remove_ref_typed<C&> o2 = obj; // ... gcc ok

remove_ref<E&>::type e1 = E::E1; // ... gcc ok
remove_ref_typed<E&> e2 = E::E1; // ... gcc internal "bus error"}

Код прекрасно компилируется в clang, но в gcc (4.7.2) последний оператор приводит к:

sandbox_cpp11.cpp:100:22: internal compiler error: Bus error
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.

Разница между проблемным утверждением и предыдущими 3 утверждениями:

  1. Он включает тип класса enum, а не тип класса enum.
  2. Он использует псевдоним-шаблон, который объявляет typename а также ::type для удобства

Мой вопрос: Использует ли typename таким образом (в «шаблоне псевдонима») соответствовать стандарту C ++ 11 даже если используется в контексте, в котором typename спецификатор иначе не понадобится? Или это «ошибка несоответствия языков» в gcc?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector