首页 > 解决方案 > 关于函数模板使用的默认参数的实例化点的一些混淆

问题描述

为了理解这个问题,请务必了解有关有状态元编程的知识,然后我们去。
引用关于默认参数实例化点的引用
[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 maincall(state<0>{});call(state<0>{})
add_state<0>call(state<0>{})call(state<0>{})

标签: c++templateslanguage-lawyer

解决方案


推荐阅读