簡體   English   中英

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的一個錯誤 我在開發者社區創建了一個錯誤報告。

一種解決方法是使用從std::integral_constant派生的輔助類:

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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM