Я компилирую этот код с 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
после, программа успешно скомпилируется.