重载解析在模板实例化点之后找到函数
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."
在下面的代码中 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."