Я компилирую этот код с gcc 9.3
с -fconcepts
.
Следующие компиляции успешно
void f(int) {} // 1
template<typename T> // 2
concept C = requires (T a)
{ { f(a) }; };
template<C T> // 3
void g() { f(42); }
int main() { g<int>(); } // 4
Однако, если я определю функцию f
после я определяю концепцию C
,
template<typename T> // 2
concept C = requires (T a)
{ { f(a) }; };
void f(int) {} // 1
template<C T> // 3
void g() { f(42); }
int main() { g<int>(); } // 4
, затем программа не может скомпилироваться с
error:
line 4: cannot call function g
because
line 3: constraint not satisfied
because
line 2: required expression f(a) would be ill-formed
Это кажется странным, поскольку к тому времени g<int>
необходимо быть созданным, определение f
должно быть видимым. Может ли кто-нибудь объяснить, что здесь происходит?
Обратите внимание, что если я объявлю f
перед определением концепции, то даже если я определю f
впоследствии, программа успешно скомпилируется.