1

考虑以下代码,它在 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. 它涉及枚举类类型,而不是非枚举类类型。
  2. 它使用一个别名模板,它声明typename::type为方便起见

我的问题:以这种方式使用typename(在“别名模板”中)是否符合 C++11 标准,即使typename在不需要说明符的上下文中使用?或者这是 gcc 中的“语言不合规错误”?

4

0 回答 0