c++ - 概念定义的放置如何改变程序行为

标签 c++ c++-concepts

我正在用 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/

相关文章:

c++ - 将数组大小减少到 1 的最小成本

c++ - void_t "can implement concepts"?

c++ - 在使用基于概念的递归功能模板推导 'auto […] '之前使用 'auto'

c++ - 如何在 C++20 'requires' 表达式中使用未指定的类型?

c++ - 为什么在定义这个 C++ 概念时会出错?

c++ - 在 C++ 和 C 中共享一个结构?

c++ - 创建类对象的 vector 时何时调用构造函数?

c++ - 标准容器是否提供一些缓存功能?

c++ - 过滤模板函数的特定迭代器

c++ - C++ 20概念: how to refer to the class name in the `requires` clause?