std::enable_if 基于使用静态 constexpr 成员函数的表达式

std::enable_if based on expression using static constexpr member function

下面的代码是合法的 C++11 吗?

#include <type_traits>

template<typename T>
typename std::enable_if<T::Data() == nullptr>::type test (T t)
{
  static_assert (t.Data() == nullptr, "pData is not null");
}

template<typename T>
typename std::enable_if<T::Data() != nullptr>::type test (T t)
{
  static_assert (t.Data() != nullptr, "pData is not null");
}

clang 编译没有错误,但 MSVC 生成以下错误消息:

error C2995: 'std::enable_if<,void>::type test(T)': function template has already been defined
note: see declaration of 'test'

我应该如何重写上面的代码,让它在常见的 C++ 编译器(GCC、Clang、MSVC)上编译?

根据@Barry,代码是合法的 C++11(它使用 GCC 和 Clang 编译)。

所以,这是一个 MSVC 的错误。我在 developer community.

中创建了一个错误报告

更新:Microsoft 已修复此错误:如错误报告中所述,下载最新的 msvc 应该可以解决此问题。

解决方法(如果您无法使用最新的 msvc)是使用派生自 std::integral_constant:[=13= 的助手 class ]

template<typename T>
class IsDataNull : public std::integral_constant<bool, T::Data() == nullptr> {};

template<typename T>
typename std::enable_if<IsDataNull<T>::value>::type test (T t)
{
  static_assert (t.Data() == nullptr, "pData is not null");
}

template<typename T>
typename std::enable_if<!IsDataNull<T>::value>::type test (T t)
{
  static_assert (t.Data() != nullptr, "pData is not null");
}