首页 > 解决方案 > 重载解析在模板实例化点之后查找函数

问题描述

在下面的代码中main返回2,而我希望它返回0(或至少7

extern struct S s;
template<typename T>
constexpr int global(T&) { return 0; }

template<typename T>
//constexpr
int func(T& t) { return global(t); }

int main()
{
    return global(s) + 2*func(s) + 4*([](auto &a){return global(a);})(s);
}

static constexpr int global(S&) { return 1; }

此代码也在https://godbolt.org/z/RkkXwf

如果我取消注释constexpr结果func更改为预期的0.

据我了解,重载决议应该只考虑模板实例化点之前的函数。但不知何故,它找到了在这一点之后声明的既不constexpr是通用 lambda 也不是通用 lambda 的上下文。

为什么这三个查找找到不同的功能?

标签: c++templatesconstexproverload-resolution

解决方案


正如 nm 在评论中提到的,函数模板可以在翻译单元的末尾实例化,请参见#993temp.point。同一段说“如果两个不同的实例化点根据单一定义规则赋予模板特化不同的含义,则程序格式错误,不需要诊断。”


推荐阅读