requires перед и после названия функции

template<typename T> requires true void f() {}
template<typename T> void f() requires true {}

В чём разница между этими функциями?


Ответы (1 шт):

Автор решения: Fat-Zer

На сколько я понимаю, разница в том, что в первом случае requires относится к объявлению шаблона, а во втором случае — к функции. Судя по всему, семантической разницы между ними нет, а чисто синтаксически можно даже написать что-то вроде:

template<typename T> requires (true)
void f() requires (false) {} // бессмысленно, но компилируется

Но, например, при объявлении функций-членов шаблонного класса возможна только вторая форма:

#include <type_traits>

template<typename T> requires (true)           // ОК
class t {
    void bar() requires (std::is_void_v<T>) {} // ОК
//  requires (std::is_void_v<T>) void baz() {} // Ошибка
};

int main() {
    t<void> t_v;                               // ОК
    t<int> t_i;                                // ОК

    t_v.bar();                                 // ОК
//  t_i.bar();                                 // Ошибка
    return 0;
}
→ Ссылка