升级至C++11

22
我们将启动一个长期的项目,使用C++作为编程语言。
我读到C++0x将在2011年推出,所以他们称之为C++11。
当C++11发布时,我们仍将继续开发项目,并希望知道是否可能现在就使用新的C++标准的任何功能,以便能够:
- 比旧版C++更快地编码 - 在新标准发布时容易转换?

6
你计划使用哪个平台/编译器? - dirkgently
3
@Joachim Herb Sutter在这篇文章中(http://herbsutter.wordpress.com/2010/03/13/trip-report-march-2010-iso-c-standards-meeting/)建议只有当标准实际发布后才能进行此类名称更改。 - anon
http://herbsutter.wordpress.com/2010/03/13/trip-report-march-2010-iso-c-standards-meeting/ - camelord
1
@camelord曾说过:“如果我们在明年发布,我们就可以停止使用‘x是十六进制’的笑话,直接称其为C++11。”但由于尚未发布,我们仍然只能使用C++0x。 - anon
@jalf 我只是在转述 Sutter 的话。 - anon
显示剩余4条评论
6个回答

14

此页面展示了gcc(主要的Unix编译器)、MSVC(主要的Microsoft编译器)和一些其他编译器(包括Intel)所支持的C++0x的部分内容。有关Clang的额外信息在这里,尽管我认为他们对当前标准的c++支持仍然不完整。


我认为最近的clang版本声称完全支持2003标准。 - Roman A. Taycher

13

仅仅因为一个标准发布并不意味着编译器会神奇地更新 - 大多数编译器花费了多年时间才能为先前的标准提供合理的支持,而一些特性从未得到很好的支持,例如 export(从 C++0x 中删除)。依赖于新功能的第一次实现并不是一个很好的策略 - 如果我在工作期限内工作,我更喜欢让别人成为实验者。

此外,我不会太快称之为 C++11 - 标准过程充满了延迟的可能性。

编辑:我看到您正在使用 RW 库。在这种情况下,新标准的许多功能可能不会立即引起兴趣,因为它们针对的是模板编写者和 C++ 标准库的用户。


2
使用新标准并不意味着不能再使用“旧”的C++。这意味着可以构建软件架构,以使用旧的C++作为与RW库的接口,并使用新的C++来处理应用程序的其余部分。 - camelord
不是“神奇”地,而是通过努力。我认为(希望?)C++0x编译器在标准发布时将处于相当良好的状态。例如,我确信Sutter在他的博客上说过,微软正在尽可能密切地跟踪草案,并且它目前打算在发布后的第一个主要版本中遵从(无论如何,与C++03一样符合,所以和你习惯的一样好)。我认为一个显著的出版延迟的更可能原因之一是如果一个或多个主要编译器突出显示实施这些变化的困难。 - Steve Jessop
@Steve:不知道你有没有Sutter那个声明的链接?无论如何,如果他们能在2012年左右(大概是下一个VS的目标时间)推出一个相当符合规范的版本,那就太好了。 :) - jalf
@jalf:抱歉,搜索不到。当我说“我确定”时,那是夸张的说法:“我想”。我可能记错了有关部分C++0x支持的评论。请不要根据我对Sutter非承诺的不可靠记忆制定商业计划;-) - Steve Jessop
嗯,我猜我只是在使用新的MFC和TB1。看起来使用C++0x版本可能会持续很长时间。 谢谢你们的回答。 - camelord

4

Visual C++ 2010和最新版本的gcc (-std=c++0x) 支持C++11的一些新特性,但并非全部。特别是,您可以使用花括号的新初始化语法;这是C++11中最大的语法变化。如果代码的一部分使用C++98样式,而另一部分使用C++11样式,则会添加最多的不一致性。


1
VS2010尚未推出。我相信任何非GM產品上都不會進行產品開發。 - dirkgently
它将在几个月内发布。问题是:“在那之前会有发布吗?”如果答案是否,则现在使用beta版开始将避免迁移。 - Didier Trosset
抱歉,什么是非转基因产品? - camelord

4
上周,《Effective C++》系列的作者Scott Meyers上传了以下内容:gcc和MSVC中C++0x特性可用性摘要。这在某种程度上与另一个链接类似,该链接在本主题的不同答案中提到。主要区别在于Meyers的链接只包含他自己尝试过的东西。我预计它将在未来几个月内不断更新。此外,这也是我发现这个链接的方式,他在comp.std.c++上暗示他正在从事与C++0x教育材料有关的工作(显然超出了他的培训课程),但现在这一切都太牵强附会了,所以让我们坚持上面提供的第一个链接。

2
不要一次性地考虑所有新功能的切换。评估每个新语言特性的优点和其实现的质量。
例如,即使在被考虑用于C++0x之前,long long已经是一个相当常见的编译器扩展,而新的auto语法很有用且可能得到很好的支持。你可能需要对某些复杂组合的新特性非常谨慎,例如使用decltype进行函数类型推断,类中使用带可变参数模板的新->语法,并采用新的>>解析规则。

1

这要看你使用的编译器。

例如,GCC具有tr1扩展,其中包含一些将在C++11中出现的功能。


没有编译器限制。唯一的要求是使用Rogue Wave库。所以我在编译器设置方面很自由。 - camelord

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