簡體   English   中英

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

[英]How do I use c++20 std::is_constant_evaluated in Visual C++ 2019 Community?

MS 聲稱在其一致性頁面上支持 is_consant_evaluated,並且它們的 <type_traits> 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

給出以下 output:

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_evaluated 會產生錯誤,而 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,問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM