gpt4 book ai didi

c++ - 函数模板重载解析,依赖和非依赖参数

转载 作者:行者123 更新时间:2023-12-01 12:30:04 33 4
gpt4 key购买 nike

鉴于以下程序

#include <iostream>

template<class T> struct id { using type = T; };

template<class T1, class T2>
int func(T1, T2) { return 0; }

template<class T1, class T2>
int func(typename id<T1>::type, typename id<T2>::type) { return 1; }

int main()
{
std::cout << func<int, int>(0, 0) << std::endl;
}

GCC 和 Clang 都打印 1对于这个程序。这个程序是否保证打印 1按标准?

我试图找到答案 here但无法破译它。看起来函数模板可能是等效的,因此会破坏 ODR,但我不确定。

是否将第二个函数模板更改为
template<class T>
using id_type = typename id<T>::type;

template<class T1, class T2>
int func(id_type<T1>, id_type<T2>) { return 1; }

做出改变?

最佳答案

这是沼泽标准的偏序。我们将独特的类型替换到其中一个函数模板中,并尝试根据它推断出另一个。两种方式都做,如果演绎只在一个方向成功,我们就有了订单。如果您想阅读神秘规则,请参阅 [temp.func.order] 和 [temp.deduct.partial]。

所以在这里,

  • 代入 T1=U1, T2=U2进入第一个重载的函数类型产生 int f(U1, U2);我们能推导出T1T2在第二次重载中?不;两者都在非推导的上下文中。因此,演绎失败。
  • 代入 T1=U1, T2=U2进入第二次重载产生 int f(id<U1>::type, id<U2>::type) (这是在定义上下文中进行的,所以我们不能进一步代入 id - 某处可能有专门化)。我们可以推导出T1T2在第一个重载中?是的,通过推导 T1 = id<U1>::typeT2 = id<U2>::type .演绎成功。

  • 由于推导仅在一个方向上成功 - 从转换后的第二个方向推导出第一个 - 第二个比第一个更专业,并且优先通过重载决议选择。

    别名模板大小写没有任何改变。

    这些模板既不是等效的,也不是功能等效的。

    关于c++ - 函数模板重载解析,依赖和非依赖参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62409234/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com