GCC, похоже, не работает при обработке ~T()
, где T
является ссылкой скалярного типа.
Он принимает следующий код , который явно глючит на [expr.pseudo] / 2 :
template<typename T> using tester = decltype(int{}.~T(), char{});
tester<int&> ch;
int main() {}
Я бы использовал if constexpr
для реализации:
template<class T>
constexpr bool my_is_destructible() {
if constexpr (std::is_reference_v<T>) {
return true;
} else if constexpr (std::is_same_v<std::remove_cv_t<T>, void>
|| std::is_function_v<T>
|| is_unknown_bound_array<T>::value ) {
return false;
} else if constexpr (std::is_object_v<T>) {
return std::experimental::is_detected_v<has_dtor, T>;
} else {
return false;
}
}
Это работает и с GCC.