查看C++ compiler support,似乎GCC 5.0+中提供了std::shared_mutex
的不定时版本。但是,即使使用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标准一样)。
我已经通过在ppa:ubuntu-toolchain-r/test
添加存储库并使用update-alternatives
来正确设置其垃圾箱来安装gcc-5和g ++ - 5。
我是否可以使用最新的C ++ 17标准正确编译代码?并且可能是一个愚蠢的问题,但即使它已经被支持,现在开始使用-std=c++1z
为时尚早?因为它受支持,对吗?
答案 0 :(得分:9)
cppreference的混淆可能是因为std::shared_mutex
确实 被添加到revision 200134的GCC 5.0中。但这是基于C ++ 1y草案的那种类型的早期化身。事实上,它是 timed 共享互斥锁,当时称为std::shared_mutex
。
在最终发布C ++ 14标准之前,std::shared_mutex
已重命名为std::shared_timed_mutex
,因此在GCC 5.1发布之前(这是5.x系列中的第一个版本)中的类型libstdc ++已重命名,请参阅revision 207964。
所以虽然在GCC 5.x预发布阶段的某个阶段有一个std::shared_mutex
类型,但它不是C ++ 17的非主流版本,并且在出现在任何正式版本之前它已重命名海湾合作委员会。
然后,在GCC 6.x发布系列的开发过程中,添加了C ++ 1z untimed共享互斥锁,重用std::shared_mutex
名称。这是提交T.C.与上述评论相关联,revision 224158。
所以C ++ 17 untimed shared_mutex
从未出现在任何GCC 5.x版本中。在第一个5.x版本发布之前的短暂时间内,有一个名为std::shared_mutex
的 timed ,但在所有正确的5.x版本中,它被称为std::shared_timed_mutex
。
2016年4月,第一个发布C ++ 17非定时版本的版本是6.1,所以在之后的任何GCC版本中你都可以使用std::shared_mutex
(只要在编译器中启用C ++ 17,例如,使用-std=gnu++17
或-std=c++17
标志。
GCC 5于2015年发布,因此期望能够在该版本中使用C ++ 17有点不切实际。 GCC 6.x和7.x具有相当不错的C ++ 1z支持(当然,仅基于当前发布时的草稿)。
答案 1 :(得分:0)
按照此链接安装/升级到最新版本的GCC和G ++。 http://tuxamito.com/wiki/index.php/Installing_newer_GCC_versions_in_Ubuntu
我已经在ubuntu上尝试并成功了。