gpt4 book ai didi

c++ - 如何在函数模板的显式特化中推导模板参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:16 25 4
gpt4 key购买 nike

考虑以下情况:

#include <iostream>

template <class T> void f(T) { std::cout << "#1\n"; } // #1
template <> void f(const int) { std::cout << "#2\n"; } // #2

int main() {
f<const int>(1); // call #1
f<int>(1); // call #2
return 0;
}

#2 似乎是 f<int>(const int)而不是 f<const int>(const int) .这里发生了什么?我的第一个想法是顶级const在函数类型转换中被丢弃,所以#2的类型是void(int) ,这导致了 f<int>(const int) 的特化.但我不确定。

为什么 C++ 允许这样的语法?我的意思是因为我们不能部分特化函数模板,如果我们想显式特化一个模板参数值,我们就会知道。那么,为什么 C++ 不只是强制程序员在专门化模板函数时显式提供模板参数值呢? (即我们必须在 template <> void f<int>(const int) { }template <> void f<int const>(const int) { } 中编写 #1 的特化)除了编码方便之外,它是否有特殊用途?

最佳答案

void f(const int p)

暂时搁置模板问题,const这里的部分没有指定f()的参数类型.所有这些const这里指定的是 pconst函数内部 f() . f() 的参数类型是int .

template <> void f(const int)

当编译器试图推导特化的类型时,它会推导出函数参数的类型是 int。 , 这必须是 f<int> 的特化.

不能以这种方式真正进行演绎。你必须明确,如果那是你想做的:

template <> void f<const int>(const int) { std::cout << "#2\n"; }

关于c++ - 如何在函数模板的显式特化中推导模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148717/

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