关于SFINAE的功能和结构之间的差异

问题描述 投票:0回答:1

我正在编写一个辅助模板的小型库,当使用std::enable_if和模板参数时遇到了意想不到的不一致。

这些函数模板在GCC 7.1中编译良好:

template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
void f() { };

template<typename T, std::enable_if_t<std::is_same_v<double, T>, T>* = nullptr>
void f() { };

int main()
{
    f<int>();
    f<double>();
}

而这些结构模板给出了编译错误:

template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
struct f { };

template<typename T, std::enable_if_t<std::is_same_v<double, T>, T>* = nullptr>
struct f { };

int main()
{
    f<int> x;
    f<double> y;
}

错误:

main.cpp:36:70: error: template parameter ‘std::enable_if_t<is_same_v<int, T>, T>* <anonymous>’
 template<typename T, std::enable_if_t<std::is_same_v<int, T>, T>* = nullptr>
                                                                  ^~~~~~~


main.cpp:40:12: error: redeclared here as ‘std::enable_if_t<is_same_v<double, T>, T>* <anonymous>’
 struct f { };
        ^

我很难理解为什么编译器抱怨的结构:

  1. 第二个模板参数有一个默认值。
  2. 即使两者都具有不同的模板参数列表,也会重新声明该结构。
c++ templates
1个回答
1
投票

这是因为函数可以重载,而structs则不能。

  • 对于函数,两个声明都可以共存,而enable_if通过SFINAE选择正确的重载。
  • 对于structs,模板参数无关紧要。同名=>重新声明。
© www.soinside.com 2019 - 2024. All rights reserved.