Поддержка MSVC (кажется, не идеальной) для constexpr - PullRequest
0 голосов
/ 28 сентября 2018

Я делаю наивное колесо типа черт is_base_of.А вот минимальная демонстрация о моей реализации (без учета надежности, is_class ...).

#include <type_traits>
#include <cstdint>
struct A
{

};
struct B : A
{

};
template
<typename T, typename U>
struct IsBaseOf {
    constexpr static bool Test(T* t)
    {
        return true;
    }

    constexpr static bool Test(...)
    {
        return false;
    }

    constexpr static bool value = IsBaseOf<T,U>::Test(static_cast<U*>(nullptr));
};
int main()
{
    static_assert(IsBaseOf<A, B>::value, "Pass");
}

Эта демонстрация может быть скомпилирована gcc / clang, но не может быть скомпилирована MSVC.http://rextester.com/ATOC6638 http://rextester.com/IWU81465

Когда я набираю его на моем ноутбуке Visual Studio 2015 (с обновлением 3).Он также не может быть скомпилирован, IDE напоминает мне, что «выражение должно иметь постоянное значение» перед компиляцией.

Поэтому мне интересно, как MSVC поддерживает constexpr или мой код неверен?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Ваш код компилируется в Visual Studio 2017 (версия cl 19.15.26726).

Вы можете попробовать добавить /std:c++14 или /std:c++latest переключатель компилятора.

0 голосов
/ 28 сентября 2018

Это почти наверняка ошибка в MSVC.Особенно предыдущие версии имели многочисленные проблемы с constexpr. Вот просто куча из них например.Поддержка многих новых функций в MSVC пока не так уж велика.Но с каждой минутой все лучше.Вы всегда будете хотеть использовать последнюю версию, чтобы испытать подобные вещи.VisualStudio 2017 прекрасно компилирует этот код…

...