C++ std::使用静态constexpr成员函数基于表达式启用_

C++ std::使用静态constexpr成员函数基于表达式启用_,c++,c++11,enable-if,C++,C++11,Enable If,下面的代码是合法的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::en

下面的代码是合法的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");
}
#包括
模板
typename std::enable_if::type test(T)
{
静态_断言(t.Data()==nullptr,“pData不为null”);
}
模板
typename std::enable_if::type test(T)
{
静态断言(t.Data()!=nullptr,“pData不为null”);
}
clang编译时没有错误,但MSVC生成以下错误消息:

error C2995: 'std::enable_if<,void>::type test(T)': function template has already been defined
note: see declaration of 'test'
错误C2995:'std::enable_if::type test(T)':函数模板已定义
注:见“测试”声明

<>我应该如何重写上面的代码,让它在普通C++编译器(GCC,Clang,MSVC)?< /P> < P>上编译,根据@巴里,代码是合法C++ 11(它使用GCC和Clang编译)。 因此,这是MSVC的一个缺陷。我在中创建了一个bug报告

解决方法是使用从
std::integral_常量
派生的助手类:

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");
}
模板
类IsDataNull:public std::integral_常量{};
模板
typename std::enable_if::type test(T)
{
静态_断言(t.Data()==nullptr,“pData不为null”);
}
模板
typename std::enable_if::value>::类型测试(T)
{
静态断言(t.Data()!=nullptr,“pData不为null”);
}

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

因此,这是MSVC的一个缺陷。我在中创建了一个bug报告

解决方法是使用从
std::integral_常量
派生的助手类:

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");
}
模板
类IsDataNull:public std::integral_常量{};
模板
typename std::enable_if::type test(T)
{
静态_断言(t.Data()==nullptr,“pData不为null”);
}
模板
typename std::enable_if::value>::类型测试(T)
{
静态断言(t.Data()!=nullptr,“pData不为null”);
}

看起来像MSVC的bug。你能提交吗?奇怪的是,如果您将它改为
T::Data
,而不是
T::Data()
,它是什么?这不重要。@barry,好的,谢谢你确认这是一个bug(并重新打开问题)。我应该在哪里提交?我不熟悉MSVC错误报告。你知道解决方法吗(不将
T::Data()
更改为
T::Data
,因为它是外部库的一部分)我也不知道,但他们应该有某种bug报告系统。我创建了一个bug报告,看起来像MSVC bug。你能提交吗?奇怪的是,如果您将它改为
T::Data
,而不是
T::Data()
,它是什么?这不重要。@barry,好的,谢谢你确认这是一个bug(并重新打开问题)。我应该在哪里提交?我不熟悉MSVC错误报告。你知道解决方法吗(不将
T::Data()
更改为
T::Data
,因为它是外部库的一部分)我也不知道,但他们应该有某种错误报告系统。我创建了一个错误报告