Рассмотрим следующий код, который прекрасно компилируется в 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 утверждениями:
typename
а также ::type
для удобстваМой вопрос: Использует ли typename
таким образом (в «шаблоне псевдонима») соответствовать стандарту C ++ 11 даже если используется в контексте, в котором typename
спецификатор иначе не понадобится? Или это «ошибка несоответствия языков» в gcc?
Задача ещё не решена.
Других решений пока нет …