Это должно быть плохо сформировано:
struct user_type {
int a;
constexpr user_type( int a ): a( a ){}
};
template< user_type u > struct value {};
Для того чтобы быть шаблоном нетипового параметра, вам необходимо удовлетворить [temp.param] / 4 :
Нетипизированный шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:
- литеральный тип, имеющий сильное структурное равенство ([class.compare.default]),
- [...]
Там, где требуется сильное структурное равенство, с [class.compare.default] / 3 :
Тип C имеет сильное структурное равенство, если при заданном значении x типа const C либо:
- C является неклассовым типом и [...], или
- C - это тип класса с оператором ==, определенным как значение по умолчанию в определении C , x == x корректно формируется при контекстном преобразовании в bool, все подобъекты базового класса C и не -статические члены данных имеют сильное структурное равенство, а в C нет изменяемых или изменчивых подобъектов.
Ключ в том, что нам нужно значение по умолчанию ==
в типе ... и у нас его нет, поэтому у нашего типа нет сильного структурного равенства, поэтому его нельзя использовать как шаблон нетипичного типа. параметр.
Однако gcc не позволяет вам объявить такой оператор, поэтому вы не можете решить проблему.
Это просто неполная реализация новой функции.