std::p opcount 标识符在 MSVC 16.6.0 中找不到

std::popcount identifier not found in MSVC 16.6.0

本文关键字:找不到 opcount 标识符 std MSVC      更新时间:2023-10-16

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

我正在使用Microsoft Visual Studio 16.6.0,C++语言标准设置为预览 - 最新C++工作草案(std:c++latest(中的功能,并尝试从cpp首选项编译popcount示例代码:

#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 声明自版本 16.5 以来一直支持位操作 (P0553R4(,并且 MSVC 16.6 定义了功能宏__cpp_lib_bitops,但上面的代码给出了以下错误:

Error   C3861   'popcount': identifier not found    ConsoleApplication3 C:UsersrsjafsourcereposConsoleApplication3ConsoleApplication3ConsoleApplication3.cpp 22  
Message     see declaration of 'std'    ConsoleApplication3 C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.26.28801includeiostream    19  
Error (active)  E0135   namespace "std" has no member "popcount"    ConsoleApplication3 C:UsersrsjafsourcereposConsoleApplication3ConsoleApplication3ConsoleApplication3.cpp 22  
Error   C2039   'popcount': is not a member of 'std'    ConsoleApplication3 C:UsersrsjafsourcereposConsoleApplication3ConsoleApplication3ConsoleApplication3.cpp 22  

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

使用当前的 MSVCstd::popcount可在/std:c++20/std:c++latest下使用。


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

用于完成并启用它的 PR 处于"正在进行"状态: https://github.com/microsoft/STL/pull/795

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