Реализует ли clang6 std:: optional?

Я хочу использовать C++17 std::optional, но в clang он отсутствует:

> cat test.cxx 
#include <optional>

int main(int, char **) {
    return 0;
}
> $CXX --version | head -n1
clang version 6.0.0 (trunk 317775)
> $CXX -std=c++17 test.cxx 
test.cxx:1:10: fatal error: 'optional' file not found
#include <optional>
         ^~~~~~~~~~
1 error generated.

Как видите, я использую довольно новую версию clang и, насколько мне известно, clang 6 должен иметь полную поддержку C++17. На первый взгляд кажется, что это проблема с лязгом, особенно потому, что включение <experimental/optional> работает нормально, но, возможно, это я что-то упускаю. У тебя есть идеи?

Спасибо


person avitase    schedule 20.11.2017    source источник
comment
Вы тоже используете Linux с последней версией GCC? Я думаю, что clang в Linux использует стандартную библиотеку GCC. Поэтому, чтобы использовать Clang с C++17 в Linux, убедитесь, что у вас установлена ​​последняя версия libstdcpp. Рассмотрите возможность использования clang libc++, если можете.   -  person Guillaume Racicot    schedule 20.11.2017
comment
clang - это просто компилятор. Чего вам не хватает, так это обновленной версии стандартной библиотеки.   -  person Rakete1111    schedule 20.11.2017
comment
Спасибо вам обоим за эти разъяснения. Итак, решение состоит в том, чтобы (пере) скомпилировать clang с собственной libc++?   -  person avitase    schedule 20.11.2017
comment
Нет, это использование более новой стандартной библиотеки для компиляции вашего кода. Неважно, какая стандартная библиотека clang использовалась для компиляции.   -  person Rakete1111    schedule 20.11.2017
comment
Разве сборка LLVM/Clang с помощью libcxx, проверенной в llvm/projects, не является одним из способов сделать это обновление?   -  person avitase    schedule 20.11.2017
comment
@avitase Нет, ты не понимаешь. Ваша системная библиотека нуждается в обновлении, а не та, которая использовалась для компиляции clang. Конечно, вы можете скачать магистральную версию и установить ее, если хотите.   -  person Rakete1111    schedule 20.11.2017
comment
Извиняюсь за неточность. Мне не нужна общесистемная установка. Я хотел использовать транковую версию, поставляемую с LLVM, в качестве замены моей системной библиотеки. Благодаря вашей помощи теперь все работает нормально.   -  person avitase    schedule 21.11.2017
comment
@ Rakete1111, сборка LLVM с libcxx в дереве не означает использование этого std::lib для компиляции clang, это означает, что libc++ будет установлен вместе с Clang и поэтому может использоваться с ним (как сказал avitase).   -  person Jonathan Wakely    schedule 13.12.2017


Ответы (1)


Как указано в комментариях, Clang, вероятно, по умолчанию использует заголовки libstdc++ системы, а libstdc++ вашей системы слишком стар для поддержки C++17.

Либо установите более новый GCC (который поставляется с более новым libstdc++), а затем сообщите Clang, как его найти, используя параметр --gcc-toolchain=/path/to/new/gcc, либо установите libc++ вместе с Clang и скажите ему использовать libc++ с параметром -stdlib=libc++.

Если вы решите установить более новую версию libstdc++, вам понадобится как минимум GCC 7.1, который первым предоставил <optional>.

person Jonathan Wakely    schedule 13.12.2017
comment
Или скомпилируйте clang с новой цепочкой инструментов gcc (у ​​меня ушли целые выходные, чтобы понять, как...) - person Barry; 13.12.2017