【发布时间】: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 <bit> intrinsics- 也许他们会等到那时? -
@chris 我得到了一个有效的宏值,即使编译失败。
-
您看到的可能是 Intellisense 找到了不适用于您的配置的定义(您可以导航到定义进行检查)。我很难回忆这些年来这种 Intellisense 支持是如何变化的。我查看了 Github 上可用的实现,而不是本地的。既然我这么说,我找到了我本地的,它包括 EDG 和 Clang。我想这会影响 Intellisense,因为 VS 的 Intellisense 引擎是 EDG。
标签: c++ c++20 visual-c++-2019