Как в 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 шт):

Автор решения: sibedir

Как верно заметил в комментариях @user7860670 (спасибо), описанная мной ситуация - это пользовательская специализации стандартного шаблона. И на этот случай есть соответствующие указания в стандарте.

21.3.2[4] Если не указано иное, поведение программы, которая добавляет специализации для любого из шаблонов из [type.traits], не определено.

Мой вопрос можно отнести к частному случаю темы обсуждавшейся вот здесь

→ Ссылка