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;
}