Смотря на Поддержка компилятора C ++, кажется, что несвязанная версия std::shared_mutex
доступно в GCC 5.0+. Однако даже при gcc version 5.3.0 20151204 (Ubuntu 5.3.0-3ubuntu1~14.04)
и компилировать с -std=c++1z
простая инициализация разделяемого мьютекса заканчивается:
error: ‘shared_mutex’ in namespace ‘std’ does not name a type
std::shared_mutex mutex_;
И нет, я уже включил правильный заголовок: #include <shared_mutex>
,
Он не может найти правильный заголовок, потому что он, кажется, не существует. На самом деле, компоновщик использует библиотеку в /usr/include/c++/5/shared_mutex
, который содержит только реализацию std::shared_timed_mutex
(как стандарт C ++ 14).
Я установил gcc-5 и g ++ — 5, добавив хранилище в ppa:ubuntu-toolchain-r/test
и используя update-alternatives
правильно настроить свои контейнеры.
Что я могу сделать, чтобы правильно скомпилировать мой код, используя новейший стандарт C ++ 17? И, вероятно, глупый вопрос, но слишком рано, чтобы начать использовать -std=c++1z
даже если это должно быть уже поддержано? Потому что это поддерживается, верно?
Беспорядок на cppreference был, вероятно, потому что std::shared_mutex
действительно было добавлен в GCC 5.0, в пересмотр 200134. Но это было раннее воплощение этого типа на основе черновика C ++ 1y. На самом деле это был приуроченная общий мьютекс, который назывался std::shared_mutex
в это время.
До публикации окончательного стандарта C ++ 14 std::shared_mutex
был переименован в std::shared_timed_mutex
и так до выпуска GCC 5.1 (который является первым выпуском в серии 5.x) тип в libstdc ++ был переименован, см. редакция 207964.
Поэтому, хотя в какой-то момент на этапе предварительной версии GCC 5.x произошла std::shared_mutex
типа, это был не C ++ 17 несвязанный, и он был переименован до появления в любом официальном выпуске GCC.
Затем, во время разработки серии выпусков GCC 6.x, был добавлен общий мьютекс C ++ 1z untimed, повторно используя std::shared_mutex
название. Это коммит T.C. ссылка на в комментариях выше, редакция 224158.
Так что C ++ 17 Untimed shared_mutex
никогда не было ни в одной версии GCC 5.x. За короткий период до выхода первой версии 5.x приуроченная один называется std::shared_mutex
, но во всех правильных выпусках 5.x это называется std::shared_timed_mutex
,
Первый выпуск C ++ 17 в несвязанном виде был 6.1 в апреле 2016 года.
GCC 5 был выпущен в 2015 году, поэтому ожидать использования C ++ 17 с этой версией немного нереально. GCC 6.x и 7.x имеют довольно хорошую поддержку C ++ 1z (но, конечно, только на основе текущих черновиков на момент выпуска).
ты можешь использовать boost::shared_mutex
вместо std::shared_mutex