我正在用 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
之后程序编译成功。
最佳答案
ADL不适用于 int
,因此 f(a)
(与 int a
)在之前未声明时格式错误。
您将遇到类似的问题:
void f(int){}
template<typename T>
void g(T t)
{
f(t);
}
void f(char){}
void h() { g('*'); } // Call f(int)
关于c++ - 概念定义的放置如何改变程序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61019722/