为什么C++11编译器支持仍需要一个标志?

21

我明白,编程语言的实验特性不应默认启用,因此我欢迎标志-std=c++0x-std=c++1y。但是,C++11自几年前就已成为标准。为什么编译器仍需要-std=c++11来启用其功能支持?


7
你可能想要查看C++11引入的破坏性变更 - Qantas 94 Heavy
1
这个问题似乎不符合主题,因为它涉及市场营销和产品包装,而非计算机编程。 - user207421
1
正如澳洲航空公司所暗示的那样,使用 c++03 编译的程序未必能够在 c++11 中编译通过。通常情况下,如果您需要更高版本的 gcc,建议您将其安装在本地以避免与库、发行版默认的编译器等问题产生冲突。 - user1508519
3
这段话大意是关于如何对一个高度使用的软件组件进行不兼容的改变。个人认为,我不会让市场部门单独做这件事情,但你的情况可能有所不同。;-p - Steve Jessop
5
我不否认你的评论,但请注意:默认情况下g++不使用完全符合c++98模式(或者c++03,两者都实际上是C++2003),而是使用gnu++98来源),它添加了一些非标准扩展;这就是为什么我总是显式地指定要使用的标准,使用-std=c++98/-std=c++03-std=c++11(并用-pedantic-errors加强执行)。因此,无论是C++98/03还是C++11,我总是需要使用一个标志(至少对于可移植代码):)(这是针对GCC和Clang;MSVC不允许您选择。) - gx_
显示剩余9条评论
2个回答

29

C++11已经成为标准多年了,但是除非以下条件满足:

  • 至少在该编译器及其使用的库中完全支持C++11,并且如果编译器作者有任何可靠性方面的担忧,则也必须保持稳定。
  • 最好升级编译器的主要版本号,因为C++11与C++03并不完全向后兼容。
  • 理想情况下,根据众所周知的时间表进行,以便用户可以为此做好准备。

基本上,许多人(和makefile)都依赖于编译器作为符合C++03标准的编译器,或者至少知道它的不符合情况。由于C++11引入了与C++03不符的新实例,因此更改可能具有潜在的痛苦感。

可以说,任何依赖于C++03的人应该指定一个选项来说明这一点,并且对默认模式的更改将对他们没有影响。但是,一旦您记录了编译器的默认值,人们将依赖于它,无论是有意还是无意。

特别是对于gcc来说,4.8.2的手册中说“对C++11的支持仍然是实验性的”。因此,我认为最终对您的问题的答案可能是要适当实现C++11需要超过2年的时间,即使从起草标准已经完成的所有工作开始。


关于第一点:应该是“完整和稳定”。在某个东西的第一次实现和真正的稳定之间有一定的时间间隔。 - James Kanze
@JamesKanze:同意这是非常理想的,负责任的编译器实现者不会发布带有不稳定默认模式的产品。我并不确定如何定义“绝对最小值”。出于质量原因,它应该是稳定的,而完整性是 -std=c++11 定义的一部分 :-) - Steve Jessop
7
这基本上是编译器供应商的判断。很多供应商声称支持C++98,然后是C++03,但从未实现'export'。不同的供应商对于稳定性也有不同的标准(并且它们的标准也会有所不同 - 我记得g ++以前每天都会发布新版本,而今天他们似乎是比较严格的"供应商"之一)。 - James Kanze
1
@JamesKanze:是的,当我说“已知非一致性”时,“export”就是我考虑的其中之一。处理从未存在过的缺失功能比处理突然停止工作的功能要容易得多,甚至是突然开始工作的功能,例如两阶段查找。 - Steve Jessop
3
在我的系统上不行。echo __cplusplus > version.cpp; g++ -E version.cpp 输出 199711L,而 g++ -std=c++11 -E version.cpp 输出 201103L。这是在 gcc 4.8.2 上的结果。 - Steve Jessop
显示剩余5条评论

4

一个小更新。GCC 6.1及以上版本默认使用C++14模式 [来源]


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