Ошибка GCC или UB? Должен ли этот код скомпилироваться?

Приведенный ниже код прекрасно компилируется с помощью clang, но не компилируется с НКУ (пробовал 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’

Является НКУ правильно в отклонении кода, или я бью его ошибку?

Постскриптум Я видел эту ошибку при попытке построить один из проектов с открытым исходным кодом. Я попытался сделать наименьший возможный пример, который воспроизводит это.

16

Решение

Это не действительный C ++ в соответствии с оригинальным стандартом:

14.3.1 стандарта гласит:

2 Локальный тип, тип без связи, безымянный тип или
тип, составленный из любого из этих типов, не должен использоваться как
Аргумент шаблона для параметра типа шаблона. [Пример: …

Однако я считаю, что это ограничение было снято по последнему стандарту C ++ 11. Это может объяснить, почему некоторые компиляторы принимают это, а другие отвергают.

1

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

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

По вопросам рекламы [email protected]