【发布时间】:2018-04-12 01:34:52
【问题描述】:
我曾经专业地用 C++ 编程,但那是很久以前的事了。现在我回到它。男孩,C++ 进化了吗!
我一直在研究 C++11 中引入的最新特性,包括 lambda 表达式、良好的多线程支持(以前只支持 boost 的东西)等。
最近,在我的 Ubuntu 16.04 LTS 机器上,我一直在编译:
g++ -std=c++11 filename.cpp
但是,显然还有 C++14 和 C++17。如果我想完全了解现代 C++ 编程实践,我应该像这样编译吗?
g++ -std=c++17 filename.cpp
假设我的代码以任何一种方式编译,有什么理由不应该只使用 C++17 编译我的所有新代码?
我已经在研究 C++14 中的 shared_timed_mutex 之类的东西,但还没有玩过 C++17 中的 atomic 等更新的东西。所以,在某些方面,我想我最终会需要 C++17。
我只是想了解在编译时总是使用 C++17 是否对我有任何伤害。
为了提供更多上下文,我只为一个平台(Ubuntu Linux)进行编译。无需考虑向后兼容性或其他操作系统。考虑到这一点,我渴望学习最新的 C++ 特性,有什么理由不应该总是用 C++17 编译?
或者,以另一种方式重述,截至今天,即 2018 年 4 月 11 日,我是否可以假设使用 -std=c++17 进行编译使用完全发布的功能,其中没有任何实验性功能?
【问题讨论】:
-
唯一真正的缺点是(除非您使用适当的技巧)您最终会依赖于较新的标准库。如果您想在不可用的地方发布您的软件,这可能是个问题。
-
嗯,现在是 2018 年,C++17 是去年发布的,所以
-std=c++17启用的功能都不是实验性的。 -
采用您现有的最新标准。没有理由不这样做,除非你需要支持旧的编译器。
-
我默认使用 C++17 标志,这是最新版本的 clang too iirc 中的默认值。只要您不需要支持旧编译器或只有过时编译器的嵌入式平台上的构建,您就应该使用最新的语言功能,如上所述。
-
仅供参考 Ubuntu 16.04 仅附带 GCC 5.4,它仅对某些 C++17 功能提供实验性支持。我不建议使用此版本使用
-std=c++17进行编译。您需要 GCC 7.x 以获得完整的 C++17 支持。最简单的方法是等到本月底发布 18.04 或使用unofficial repository。