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

时间:2019-07-02 16:54:00

标签: c++ templates constexpr overload-resolution

在下面的代码中,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。

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

1 个答案:

答案 0 :(得分:3)

如n.m.在注释中,功能模板可以在翻译单元的末尾实例化,请参见#993temp.point。同一段中写道:“如果两个不同的实例化点根据一个定义规则赋予模板专业化不同的含义,则该程序格式不正确,无需诊断。”