C++11、C++14、C++17?该使用哪个?

4

我曾经从事过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进行编译将使用完全发布的功能,没有任何实验性质的内容吗?

4
唯一真正的缺点是,除非您采取适当的技巧,否则您将依赖于更新的标准库。如果您想在不可用的地方发布软件,则可能会成为问题。 - Chris Kitching
2
嗯,现在是2018年,C++17已经在去年发布了,因此使用“-std=c++17”启用的所有功能都不再是实验性的。 - Praetorian
3
使用您可用的最新标准。除非需要支持旧编译器,否则没有理由不这样做。 - Jesper Juhl
我已投票关闭此问题,因为它基于个人观点。选择使用哪种语言/标准需要考虑很多因素,包括每种语言/标准可用编译器和库的质量、针对您所选硬件的这些编译器和库的可用性、使用旧标准功能的遗留代码量,这些功能在新标准中不受支持,需要支持旧编译器还是新编译器等等...... - Peter
2
FYI,Ubuntu 16.04只附带GCC 5.4,该版本仅对某些C++17功能提供实验性支持。我不建议使用此版本进行-std=c++17编译。您需要GCC 7.x才能完全支持C++17。最简单的方法是等到本月底发布18.04或使用非官方存储库 - Fibbs
显示剩余2条评论
1个回答

4
答案取决于许多因素,但主要问题是你的库或应用程序的目标是什么?你计划支持哪些平台?
有一些平台没有最新版本的C++编译器。事实上,有一些平台只能提供C++03。
由于新版本的C++引入了一些新的酷功能和标准库API,所以最好使用最新的C++来覆盖你计划使用的所有平台。
如果你不知道要使用什么平台,请考虑你希望使用的C++功能,并使用可以提供它们的最小版本的C++。这样,你可以推迟对支持的平台做出决定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接