c++ - 关于 SFINAE 的函数和结构之间的差异

标签 c++ templates

我目前正在编写一个小型辅助模板库,在将 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. 重新声明结构,即使两者具有不同的模板参数列表。

最佳答案

这是因为函数可以重载而 struct 不能。

  • 对于函数,两种声明可以共存,并且 enable_if 通过 SFINAE 选择正确的重载。
  • 对于struct,模板参数无关紧要。同名 => 重新声明。

关于c++ - 关于 SFINAE 的函数和结构之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51450850/

相关文章:

c++ - 什么是 Mixin(作为一个概念)

C++ 模板运算符重载 std::enable_if

shell - Visual Studio 2010 Shell 隔离模板损坏

c++ - 使用 Direct2D 组合多个几何图形

C++/Qt - QThread 与 QRunnable

c++ - 我如何在 C++ 的 Caesar Cipher 程序中包含空格?

c++ - 查找所有文件时未显示文件名

c++ - 函数指针和类模板

c++ - 应该翻转数字的程序输出不正确

c++ - 模拟模板类的静态构造函数