std::underlying_type
與非枚舉類型一起使用時會調用未定義的行爲。 但未定義的行爲出現在哪裏?std :: underlying_type:SFINAE是否阻止未定義的行爲?
在此代碼:
template<typename E>
constexpr std::enable_if_t<std::is_enum<E>::value, std::underlying_type_t<E>> IntEnum(E e)
{
return static_cast<std::underlying_type_t<E>>(e);
}
我試圖用std::enable_if
以防止用戶調用IntEnum
與非枚舉類型。但由於enable_if
在決定是否可以調用該函數之前進行了評估,因此也會對其模板參數進行評估,包括std::underlying_type_t<E>
。如果用非枚舉類型調用此UB,那麼也是如此?我該如何改變它?
BTW,這不是UB,但編譯錯誤。 – Jarod42
http://en.cppreference.com/w/cpp/types/underlying_type似乎說不然,是一個錯誤? –
@AlexandreS。我相信那是一個錯誤。如果'std :: underlying_type'的'Condition'規範被寫爲* Requires *子句,那隻會是未定義的行爲,事實並非如此。有未定義的行爲來實例化模板似乎很奇怪。 – TartanLlama