【问题标题】:class template SFINAE类模板 SFINAE
【发布时间】:2020-04-24 07:23:01
【问题描述】:

我正在测试类模板 SFINAE。

template<typename T, typename...Types>
using enable_if_class = T;

template<typename T, typename...Types>
struct enable_if_test;

template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "const version!\n";
    }
};

template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "nonconst version!\n";
    }
};

以上代码在 g++ 上编译,但在 clang++ 和 Visual Studio 上出现错误。当代码更改为:

template<typename T, typename...Types>
using enable_if_class = T;

template<typename T, typename...Types>
struct enable_if_test;

template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "const version!\n";
    }
};

template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
    enable_if_test() {
        std::cout << "nonconst version!\n";
    }
};

这次只有 g++ 出错。 所以这是我的问题,这是编译器错误还是我的代码是非法的? 如果这是编译器错误,是否有某种原因导致此错误?

【问题讨论】:

  • 请在问题中包含错误信息
  • 顺便说一句,这里 g++ 接受Demo (T)Demo (void) 两个版本。

标签: c++ templates c++17 sfinae


【解决方案1】:

在 GCC 中,这是一个在 4.9.4 及更低版本中可见的编译器错误,并在 5.1 版本中修复。

GCC 4.9.4 Demo

GCC 5.1 Demo

我建议您使用较新版本的 GCC 或 CLANG。

【讨论】:

    【解决方案2】:

    这似乎是一个类似于std::void_t 发现的CWG (1558) 的clang/msvc 错误,使用:

    template<typename T, typename...Types>
    struct enable_if_class_impl
    {
        using type = T;
    };
    
    template<typename T, typename...Types>
    using enable_if_class = typename enable_if_class_impl<T, Types...>::type;
    

    让所有编译器都开心:

    Demo (T)

    Demo (void)

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 1970-01-01
      • 2019-07-19
      • 2017-10-06
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多