Как в MSVC перегрузить стандартные type_traits?
template <typename T>
struct MyT {};
template <typename T>
constexpr bool std::is_void_v<MyT<T>> = true;
static_assert(std::is_void_v<MyT<int>>);
В clang и gcc static_assert
отрабатывает корректно. А вот msvc считает, что is_void_v
всё еще false
.
https://godbolt.org/z/9r6YeaM91
Я уже сталкивался с тем, что в msvc некоторые вещи ведут себя не совсем как в чистом c++, но там, насколько я помню, можно было это регулировать директивами компилятора. Может здесь тоже есть какие-то директивы? Или это чисты баг (особенность))))? Ну или как их вообще перегружать в msvc?
Ответы (1 шт):
Как верно заметил в комментариях @user7860670 (спасибо), описанная мной ситуация - это пользовательская специализации стандартного шаблона. И на этот случай есть соответствующие указания в стандарте.
21.3.2[4] Если не указано иное, поведение программы, которая добавляет специализации для любого из шаблонов из [type.traits], не определено.
Мой вопрос можно отнести к частному случаю темы обсуждавшейся вот здесь