Ограничения и явное создание шаблона - PullRequest
4 голосов
/ 11 июля 2020

Следующий код не компилируется во всех 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>;

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

1 Ответ

2 голосов
/ 14 июля 2020

Похоже, это ошибка в компиляторах; Я сообщил об этом для всех трех компиляторов. Visual Studio совсем недавно исправила это в 16.7 Preview 1. G cc разработчики согласились, что это ошибка. О Clang пока ничего не известно.

...