c++ - 关于函数模板使用的默认参数的实例化点的一些混淆
问题描述
为了理解这个问题,请务必了解有关有状态元编程的知识,然后我们去。
引用关于默认参数实例化点的引用
[temp.point]/2
如果以使用该函数模板或成员函数的默认参数定义的方式调用类模板的函数模板或成员函数,则默认参数的实例化点是函数模板的实例化点或成员函数特化。
如果我对上述引用的理解正确,则表示默认参数的 POI 与使用默认参数的函数模板的 POI 相同(或者如果我误解了这个项目符号,请纠正我)。
现在,准备考虑以下代码:
#include <iostream>
template<int N>
struct state {
friend auto call(state<N>);
};
template<int N>
struct add_state {
friend auto call(state<N>) {
return N;
}
static const int value = N;
};
template<typename T, int N>
T show(int = add_state<N>::value) {
return T{};
}
int main() {
show<int, 0>();
call(state<0>{});
}
实际上,上面的代码格式正确(这里的结果是godbolt)。但是,根据上面的引用,的POIadd_state<0>
将与翻译单元之后或末尾的POI相同(show<int, 0>()
也许, 大多数编译器将 translate 单元的末尾作为函数模板的 POI),但是此时的调用找不到 的定义,因此格式错误。
上面代码的结果证明,POI必须在调用之前,只有在这种情况下,才能查找到的定义。所以很困惑,如何解释这个问题,我感谢正确的解释。show<int, 0>()
function main
call(state<0>{});
call(state<0>{})
add_state<0>
call(state<0>{})
call(state<0>{})
解决方案
推荐阅读
- r - Add gradient color within groups in ggplot2
- javascript - 谷歌应用脚本中全局变量的增量不起作用
- vue.js - vue js - Cannot read property 'use' of undefined
- python - Python:为什么 '.sort()' 没有按预期工作?
- excel - 检查一个组合框是否为空而另一个不是
- c# - 从 Unity 向 AWS Lambda 函数发送输入参数
- powershell - 如何使用 Format-Table cmdlet 显示所有属性
- flutter - 使用 PDFViewer 包显示带有颤动的 pdf 文件时的 LateError
- botframework - 基于 Bot Framework Composer 中用户输入的 if-else 分支语法
- python - 使用回溯的骑士巡回赛问题:代码不生成任何输出