Как использовать c ++ 20 std :: is_constant_evaluated в сообществе Visual C ++ 2019? - PullRequest
1 голос
/ 06 августа 2020

Заявление MS о поддержке is_consant_evaluated на их странице соответствия и их заголовок действительно включает реализацию, защищенную с помощью #if _HAS_CXX20.

Кажется, что (по крайней мере, с MSV C Community 16.6.5) / std: c ++ latest не определяет _HAS_CXX20 . Пользовательский интерфейс не предлагает параметр / std: c ++ 20.

например,

    #include <type_traits>
    static_assert( std::is_constant_evaluated(), "" );
    #ifdef _HAS_CXX20
    static_assert(false, "");
    #endif

дает следующий результат:

1>ConsoleApplication7.cpp
1>ConsoleApplication7.cpp(3,21): error C2039: 'is_constant_evaluated': is not a member of 'std'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\type_traits(20): message : see declaration of 'std'
1>ConsoleApplication7.cpp(3,42): error C3861: 'is_constant_evaluated': identifier not found
1>ConsoleApplication7.cpp(5,15): error C2338:
1>Done building project "ConsoleApplication7.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Обратите внимание, что использование is_constant_evauluated выдает ошибку, а static_assert - нет.

Что мне не хватает?

1 Ответ

1 голос
/ 06 августа 2020

Я не могу воспроизвести ваши ошибки, у меня работает нормально, _HAS_CXX20 установлен правильно. и is_constant_evaluated работает нормально.

std::cout << _HAS_CXX20;

выводит 1.

Моя реализация:

#if _HAS_CXX20
// FUNCTION is_constant_evaluated
_NODISCARD constexpr bool is_constant_evaluated() noexcept {
    return __builtin_is_constant_evaluated();
}
#endif // _HAS_CXX20

Сведения о моей версии:

введите описание изображения здесь

Надеюсь, это поможет.

В любом случае, если __builtin_is_constant_evaluated() работает, просто определите _HAS_CXX20 как 1, проблема решена.

...