Следующий код не компилируется во всех g cc 10.1, msv c 19.24 и clang 10.0.0:
template <int N>
struct A {
void g() requires (N == 3) {}
void f() requires (N == 3) { g(); }
};
template struct A<2>;
Ошибка выглядит примерно как
error C7500: 'g': no function satisfied its constraints
Меня это несколько удивляет. Работает ли это по назначению, это дефект компилятора или дефект стандарта?
Я надеялся, что такой запрос-оператор предоставит мне функции-члены, которые условно присутствуют в значениях аргументы шаблона. Обходной путь следующий:
template <int N>
struct A {
void g() requires (N == 3) {}
template <bool = true>
void f() requires (N == 3) { g(); }
};
template struct A<2>;
который компилируется, как ожидалось, но вводит посторонний аргумент шаблона, единственная цель которого - предотвратить создание экземпляра.