我明白,编程语言的实验特性不应默认启用,因此我欢迎标志-std=c++0x
和-std=c++1y
。但是,C++11自几年前就已成为标准。为什么编译器仍需要-std=c++11
来启用其功能支持?
我明白,编程语言的实验特性不应默认启用,因此我欢迎标志-std=c++0x
和-std=c++1y
。但是,C++11自几年前就已成为标准。为什么编译器仍需要-std=c++11
来启用其功能支持?
C++11已经成为标准多年了,但是除非以下条件满足:
基本上,许多人(和makefile)都依赖于编译器作为符合C++03标准的编译器,或者至少知道它的不符合情况。由于C++11引入了与C++03不符的新实例,因此更改可能具有潜在的痛苦感。
可以说,任何依赖于C++03的人应该指定一个选项来说明这一点,并且对默认模式的更改将对他们没有影响。但是,一旦您记录了编译器的默认值,人们将依赖于它,无论是有意还是无意。
特别是对于gcc来说,4.8.2的手册中说“对C++11的支持仍然是实验性的”。因此,我认为最终对您的问题的答案可能是要适当实现C++11需要超过2年的时间,即使从起草标准已经完成的所有工作开始。
-std=c++11
定义的一部分 :-) - Steve Jessopecho __cplusplus > version.cpp; g++ -E version.cpp
输出 199711L
,而 g++ -std=c++11 -E version.cpp
输出 201103L
。这是在 gcc 4.8.2 上的结果。 - Steve Jessop
c++03
编译的程序未必能够在c++11
中编译通过。通常情况下,如果您需要更高版本的 gcc,建议您将其安装在本地以避免与库、发行版默认的编译器等问题产生冲突。 - user1508519g++
不使用完全符合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_