考虑以下代码,它在 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 中的“语言不合规错误”?