重载解析在模板实例化点之后找到函数

Overload resolution finds functions after template instantiation point

在下面的代码中 main returns 2 而我希望它 return 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

如果我在 func 上取消注释 constexpr,结果将更改为预期的 0

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

为什么这三个查找找到不同的函数?

如 n.m 所述。在注释中,函数模板可以在翻译单元的末尾实例化,参见 #993 and temp.point。同段说"If two different points of instantiation give a template specialization different meanings according to the one-definition rule, the program is ill-formed, no diagnostic required."