C++ 17 std :: variant头文件(clang 6.0.0)

Mar*_*rco 8 c++ clang variant c++17

更新

我把这个问题缩小到(可能!它并不完全清楚,甚至可以阅读我能找到的关于该主题的所有内容)安装stdlibc++-7-dev将为我提供合适的(即符合C++ 17的)STL标头和库.

这(显然)也与Ubuntu 17.04(artful?)捆绑在一起,但不适用于xenial我正在使用的(Ubuntu 16.04.3 LTS).

我已经尝试下载单个.deb软件包并安装它们,但它很快就变成了一个未解决的依赖项迷宫.

如果有人能指出如何libstdc++-7-dev在16.04 安装,我将非常感激.

原始问题

我刚刚通过包管理器在Ubuntu 16.04中安装了clang ++ 6.0(遵循这些说明)并且一切看起来都很好:/usr/bin/clang++-6.0工作得很好,如果我尝试使用仅适用于C++ 17(non-type template arguments with auto此处)的东西,它会编译并且一旦我设置,就会运行CMAKE_CXX_COMPILER=/usr/bin/clang++-6.0- 而当我没有运行时它会失败.

所以...... clang 6.0像宣传的那样理解C++ 17(doh!)但是当我使用时:

#include <variant>
Run Code Online (Sandbox Code Playgroud)

找不到我期望的文件:

$ ll /usr/include/clang/6.0.0/
total 0
lrwxrwxrwx 1 root root 45 Aug  6 21:32 include -> ../../../lib/llvm-6.0/lib/clang/6.0.0/include
Run Code Online (Sandbox Code Playgroud)

或者我能想到的任何其他地方.

是否有人知道(a)是否应该在那里和(b)如果是这样,我在哪里可以找到它?

更新

我仔细检查过我有最新的(我认为)stdc++库:

$ sudo apt-get install libstdc++-5-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libstdc++-5-dev is already the newest version (5.4.0-6ubuntu1~16.04.4).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Run Code Online (Sandbox Code Playgroud)

同样的libstdc++-6-dev; 我也有libc++-dev:

$ sudo apt-get install libc++-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libc++-dev is already the newest version (3.7.0-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Run Code Online (Sandbox Code Playgroud)

尽管如此,该variant.h*文件无处可寻.还有什么我应该尝试的吗?

Mar*_*low 3

是的,clang 5.0(或者更确切地说,将作为 clang 5 的一部分发布的 libc++)具有标<variant>头。但你需要确保你已经安装了libc++。

正如 @KayEss 提到的,您需要传递-std=c++17(或同一标志的早期版本-std=c++1z),因为变体是仅 C++17 的功能。

  • 当您为 Ubuntu 安装 clang 时,它会设置为使用已安装的 C++ 标准库 (libstdc++)。这很有帮助,因为这意味着您可以“混合和匹配”使用 gcc 和 clang 编译的目标文件。您还需要安装 `libcxx` 软件包(示例如下:https://launchpad.net/ubuntu/+source/libc%2B%2B)并将 `-std=libc++` 传递给 clang。 (2认同)