3

我做错了什么还是微软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)并尝试从 cppreference 编译 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 版和 MSVC 16.6 定义功能宏以来已支持位操作 ( P0553R4 ) ,但上述代码仍会出现以下错误:__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,但它似乎对我的应用程序被禁用。

4

1 回答 1

3

当前 MSVC在和std::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修复,但由于更改集成的延迟,该修复可能仍不适用于最新版本。

于 2020-05-25T03:35:40.447 回答