c++ - 重载解析在模板实例化点之后查找函数
问题描述
在下面的代码中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 的上下文。
为什么这三个查找找到不同的功能?
解决方案
正如 nm 在评论中提到的,函数模板可以在翻译单元的末尾实例化,请参见#993和temp.point。同一段说“如果两个不同的实例化点根据单一定义规则赋予模板特化不同的含义,则程序格式错误,不需要诊断。”
推荐阅读
- angular - 单元格渲染器组件在垫选项卡内时移出 AG 网格
- python - 如何摆脱python列表中的Nonetype
- c# - Visual Studio 2019 .NET CORE 和 React 模板子站点
- c# - asp.net core mvc 中的自定义路由和操作名称
- regex - 正则表达式:从数组单元中提取多个 URL 字符串
- javascript - 获取新创建的元素并分配 onClick 函数或添加点击事件
- gcloud - 获取值项目返回“未设置”
- mysql - 从多个表中获取记录,但每个 ID 只显示 1 条?
- swift - 努力将数据传递给 UI - Swift
- gatsby - 盖茨比错误:TypeError [ERR_INVALID_ARG_TYPE]