【问题标题】:How do I use c++20 std::is_constant_evaluated in Visual C++ 2019 Community?如何在 Visual C++ 2019 社区中使用 c++20 std::is_constant_evaluate?
【发布时间】:2020-11-26 18:22:45
【问题描述】:

MS 声称在他们的conformance page 上支持 is_consant_evaluated,并且他们的 标头确实包含一个实现,由 #if _HAS_CXX20 保护。

似乎(至少在 MSVC 社区 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 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 不会。

我错过了什么?

【问题讨论】:

  • “似乎(至少在 MSVC 社区 16.6.5 中)/std:c++latest 不会导致 _HAS_CXX20”——您提出此主张的依据是什么?是具体的。您是否尝试过一个简单的程序,例如 #ifdef _HAS_CXX20 std::cout &lt;&lt; "_HAS_CXX20\n" #endif
  • 公平点,可能 _HAS_CXX20 无论如何只能在 stdlib 头文件中定义。我将添加一个示例。
  • 您是否通过安装程序安装了 Visual C++ 的更新?

标签: c++ visual-c++ std c++20


【解决方案1】:

我无法重现您的错误,它对我来说很好,_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,问题就解决了。

【讨论】:

  • fwiw 实现只是包装了对 __builtin_is_constant_evaluated() 的调用 - 如果我直接使用它,它就可以工作 - 表明至少可以在 constexpr 上下文中使用内在函数,正如你所希望的那样;)
  • @DanGroom 可以肯定的是,我的实现#if _HAS_CXX20 // FUNCTION is_constant_evaluated _NODISCARD constexpr bool is_constant_evaluated() noexcept { return __builtin_is_constant_evaluated(); } #endif // _HAS_CXX20
  • @DanGroom,无论如何,我无法重现您的错误,它对我来说很好,_HAS_CXX20 设置正确。 is_constant_evaluated 工作正常。
  • @DanGroom,我在答案中发布了我的设置详细信息,也许你能发现其中的差异,如果你需要更多详细信息,请告诉我。
  • 我想我一定是在更改一个构建配置的 std 设置并使用另一个构建配置,因为当我确保 UI 正在为所有配置和所有平台设置属性时,它就像你描述的那样工作。再次感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2020-03-20
  • 2020-09-27
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多