如何在Visual C++ 2019社区中使用c++20 std::is_constant_evaluated?

a11xaf1n  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(148)

MS声称在他们的conformance page上支持is_constant_evaluated,并且他们的<type_traits>头部确实包含一个实现,并使用#if_HAS_CXX20进行保护。
似乎(至少在MSVC Community 16.6.5中)/std:clatest不会导致定义_HAS_CXX20。UI不提供/std:c20选项。
例如

#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不会。
我错过了什么?

py49o6xq

py49o6xq1#

它对我来说工作正常,_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

问题似乎是您正在使用#ifdef而不是#if

相关问题