如何在 Visual C++ 2019 社区中使用 c++20 std::is_constant_evaluated?
How do I use c++20 std::is_constant_evaluated in Visual C++ 2019 Community?
MS 声称在他们的 conformance page 上支持 is_consant_evaluated,他们的 header 确实包含一个实现,由 #if _HAS_CXX20 保护。
似乎(至少对于 MSVC Community 16.6.5)/std:c++latest 不会导致定义 _HAS_CXX20。 UI 不提供 /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 Studio19\Community\VC\Tools\MSVC.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 不会。
我错过了什么?
我无法重现您的错误,它对我来说工作正常,_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,问题就解决了。
MS 声称在他们的 conformance page 上支持 is_consant_evaluated,他们的
似乎(至少对于 MSVC Community 16.6.5)/std:c++latest 不会导致定义 _HAS_CXX20。 UI 不提供 /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 Studio19\Community\VC\Tools\MSVC.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 不会。
我错过了什么?
我无法重现您的错误,它对我来说工作正常,_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,问题就解决了。