krs*_*sch 5 c++ templates overload-resolution constexpr
在下面的代码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; }
Run Code Online (Sandbox Code Playgroud)
该代码也位于https://godbolt.org/z/RkkXwf
如果我constexpr对func结果不加评论,则更改为预期值0。
据我了解,重载解析应该只在模板实例化点之前考虑函数。但是不知何故,它找到了在此之后声明的上下文,既不constexpr是通用lambda ,也不是通用lambda。
为什么这三个查询找到不同的功能?
正如 nm 在评论中提到的,函数模板可以在翻译单元的末尾实例化,请参阅#993和temp.point。同一段说:“如果根据单一定义规则,两个不同的实例化点赋予模板专门化不同的含义,则该程序格式错误,无需诊断。”