【问题标题】:std::popcount identifier not found in MSVC 16.6.0在 MSVC 16.6.0 中找不到 std::popcount 标识符
【发布时间】:2020-05-25 01:47:49
【问题描述】:

是我做错了什么,还是 Microsoft 对 std::popcount 的支持在 Visual Studio 16.6.0 版中被破坏了?

我正在使用 Microsoft Visual Studio 16.6.0,将 C++ 语言标准设置为 Preview - Features from the latest C++ Working Draft (std:c++latest) 并尝试编译 @987654321 @:

#include <bit>
#include <bitset>
#include <cstdint>
#include <initializer_list>
#include <iostream>

int main()
{
    for (std::uint8_t i : { 0, 0b11111111, 0b00011101 }) {
        std::cout << "popcount(0b" << std::bitset<8>(i) << ") = "
            << std::popcount(i) << '\n';
    }
}

尽管 cppreference 声明位操作 (P0553R4) have been supported since version 16.5 和 MSVC 16.6 定义了功能宏 __cpp_lib_bitops,但上面的代码给出了以下错误:

Error   C3861   'popcount': identifier not found    ConsoleApplication3 C:\Users\rsjaf\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 22  
Message     see declaration of 'std'    ConsoleApplication3 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\iostream    19  
Error (active)  E0135   namespace "std" has no member "popcount"    ConsoleApplication3 C:\Users\rsjaf\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 22  
Error   C2039   'popcount': is not a member of 'std'    ConsoleApplication3 C:\Users\rsjaf\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 22  

当我查看 bit 标头时,我确实看到了 popcount 的模板,但它似乎对我的应用程序被禁用。

【问题讨论】:

  • 有趣的是,Intellisense 知道该函数并且 F12 跳转到实现,但编译器发出“不是 std 成员”错误。您可能想通过developercommunity.visualstudio.com 报告问题
  • 查看yvals_core.h__cpp_lib_bitops 仅针对 Clang 定义。我不能说为什么,但// a future MSVC update will embed CPU feature detection into &lt;bit&gt; intrinsics - 也许他们会等到那时?
  • @chris 我得到了一个有效的宏值,即使编译失败。
  • 您看到的可能是 Intellisense 找到了不适用于您的配置的定义(您可以导航到定义进行检查)。我很难回忆这些年来这种 Intellisense 支持是如何变化的。我查看了 Github 上可用的实现,而不是本地的。既然我这么说,我找到了我本地的,它包括 EDG 和 Clang。我想这会影响 Intellisense,因为 VS 的 Intellisense 引擎是 EDG。

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


【解决方案1】:

在当前的 MSVC 中,std::popcount/std:c++20/std:c++latest 下可用。


正如@chris 指出的那样,该功能尚未实现,因为运行时 CPU 功能检测尚未实现。

最终确定并启用它的 PR 处于 work in progress 状态: https://github.com/microsoft/STL/pull/795

在实现它们之前定义__cpp_lib_bitops(用于智能感知)和__cpp_lib_int_pow2(通常)是一个错误。它已由 https://github.com/microsoft/STL/pull/695 修复,但由于更改集成的延迟,该修复可能仍不适用于最新版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2013-03-17
    • 2015-03-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多