GCC bug还是UB?这段代码应该编译吗?

时间:2012-12-02 06:44:22

标签: c++ gcc gcc4.7

下面的代码用clang编译好,但不用GCC编译(试过4.1.2,4.5.4和4.7.2):

template <typename T>
struct A
{
    struct B { };
};

template <typename T>
bool operator==(typename A<T>::B const& b, T const&  t);

enum { BAR };

template <typename T>
bool test()
{
    return 0 == BAR;
}

GCC 4.7.2的错误消息是:

a.cpp: In instantiation of ‘struct A<<anonymous enum> >’:
a.cpp:12:6:   required by substitution of ‘template<class T> bool operator==(const typename A<T>::B&, const T&) [with T = <anonymous enum>]’
a.cpp:19:17:   required from here
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error:   trying to instantiate ‘template<class T> struct A<T>::B’
a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type
a.cpp:6:12: error:   trying to instantiate ‘template<class T> struct A<T>::B’

GCC拒绝代码是正确的,还是我遇到了它的错误?

P.S。我在尝试构建一个开源项目时看到了这个错误。我试图尽可能小的再现它的例子。

1 个答案:

答案 0 :(得分:1)

根据原始标准,它不是有效的C ++:

标准的14.3.1说:

  

2本地类型,没有链接的类型,未命名的类型或   任何这些类型的复合类型不得用作   模板类型参数的模板参数。 [例子:......

但是我相信这是限制被最新的C ++ 11标准删除了。这可以解释为什么有些编译器会接受它而有些编译器拒绝它。