C++ 11:一种新语言?

Gia*_*rdi 31 c++ c++11

最近我开始阅读(只是一点)当前的未来C++ 11标准草案.

有很多新功能,其中一些已经可以通过Boost Libs获得.当然,我对这个新标准非常满意,我希望尽快使用所有新功能.

无论如何,与一些朋友,长期的C++开发者谈论这个草案,出现了一些担忧.所以,我问你(回答):

1)语言本身

此更新非常庞大,对于单个标准更新而言可能过于庞大.巨大的编译器供应商(即使他们中的大多数已经开始实现某些功能),但也为最终用户.

特别是,我的一个朋友告诉我" 这是一种新语言 ".

  • 在此更新后,我们可以将其视为一种全新的语言吗?
  • 您是否打算切换到新标准或遵守"旧"标准?

2)语言知识

  • 学习曲线将如何受到新标准的影响?
  • 教语言会更难吗?
  • 有些功能,虽然非常棒,但对我来说似乎有点过于"学术性"(我的意思是定义).我错了吗?
  • 掌握所有这些新增功能可能是一场噩梦,不是吗?

Mik*_*ron 18

总之,不,我们不能认为这是一种新语言.它是相同的语言,新功能.但是,如果您使用的是支持0x标准的编译器,那么它们现在将成为标准包含,而不是通过使用Boost库进行操作.

一个不具备同时使用支持新标准的编译器使用新的标准.如果正在开发的软件存在某些约束,则必须学习和使用新标准,但这是任何软件努力的约束.我认为,这将0X标准带来的新特性将会使做某些事情变得更容易且不易出错,所以这是一个人的优势,学习新的功能是什么,以及它们将如何改善将来的工作他们的设计策略.人们还必须学习它,以便在使用它开发的软件上工作时,他们将了解正在发生的事情并且不会产生大的嘘声.

至于我是否会" 切换到新标准 ",如果这意味着我将学习新标准并在适用的地方使用它并提高我的工作效率,那么是的,我当然打算转换.然而,如果这意味着我会限制自己只与0X标准的新功能的工作,那么没有,因为我的大部分工作涉及代码的标准之前写的,这将是一个巨大的承诺,重新设计一切以使用新特征.不仅如此,它还可能会引入新的错误和性能问题,而这些问题在没有经验的情况下我并不知道.

学习C++一直是程序员可以进行的更具挑战性的旅程之一.在语言中添加新功能不会改变学习语法的难度以及如何有效地使用它,但这种方法会发生变化.人们仍然会学习指针及其工作原理,但他们也会学习智能指针及其管理方式.在某些情况下,人们会比以前以不同的方式学习东西.例如,人们仍然需要学习如何初始化事物,但现在他们将学习统一初始化和初始化列表作为主要的工作方式.在某些情况下,通过在函数声明中添加新的范围语法或自动返回类型,可能更容易理解事物.我认为总的来说,C++将变得更容易学习和使用,同时变得更容易教学.

掌握一门语言是一项长期目标,不可能在一夜之间完成.认为人们可以快速掌握像C++这样复杂的东西是愚蠢的.它需要练习,经验和调试代码才能真正发挥作用.学术学习是一回事,但使用这些知识是一个完全不同的怪物.我认为,如果一个人已经掌握了C++语言,那么新概念不会带来太大的负担,但新人可能会有一个优势,因为他们不会费心去学习一些更为陈旧的做事方式. .

  • 实际上,统一初始化,自动,......是新手将学习作为语言的"正常"部分的东西...... (2认同)

Ric*_*den 15

1)语言本身

据我所知,C++'03和C++'0x之间确实没有重大变化.我在这里唯一能想到的就是使用 auto作为存储类说明符,但由于它没有语义含义,我不认为这是一个问题.

该标准还有许多其他学术性修复,非常需要,例如对成员数据布局的更好描述.最后,随着多核/ cpu架构成为常态,修复内存模型是必须的.

2)语言知识

就个人而言,我觉得99.9%的C++开发人员使用新语言会更容易.我特别想到auto,lambda和constexpr等功能.这些功能真的应该使用这种语言更有乐趣.

在更高级别,您还有其他功能,如可变参数模板等,可以帮助更高级的用户.

但是这里没什么新东西,我仍然对那些没有使用过(甚至没有听过)STL的日常C++开发人员感到惊讶.

从个人的角度来看,我在新标准中关注的唯一特征是概念.由于这是一个如此大的变化,模板发生的相同问题(即完全破坏的实现)是一个真正的危险.

更新FDIS投票后的投票:

碰巧,"概念"被删除了C++ 0x,并将再次用于C++ 1x.最后除了可能会破坏你的代码之外还有一些变化auto,但实际上它们可能很少见.关键差异可以在FDIS的附录C.2中找到(pdf).

  • 我认为Concept将解决模板使用(和调试)的大部分问题.无论如何,也许你应该补充一点,未来的C++新用户不需要知道语言的所有旧规则,这些规则将被一些新功能很好地取代. (2认同)

小智 12

对我来说,最重要的一个是:

unique_ptr + std :: move()!

想像:

  1. 智能指针没有任何开销:

    • 没有参考计数操作
    • 参考计数器变量没有额外的存储空间
  2. 可以移动的智能指针,即.移动时没有析构函数/构造函数调用

这给你带来了什么?异常安全,便宜(指针..)容器,没有任何成本.容器将只能memcpy()unique_ptrs,因此通过智能指针包装常规指针不会导致性能损失!所以,再一次:

  1. 你可以使用指针
  2. 它会安全(没有内存泄漏)
  3. 这将花费你什么
  4. 您将能够将它们存储在容器中,并且能够以低成本方式执行"大规模"移动(类似memcpy).
  5. 这将是例外安全

:)

另一个角度来看:

  1. 实际上,当您使用copy()移动对象组时,每个对象实例都会有构造函数和析构函数调用.当您复制1000个1kb大小的对象时,将至少有一个memcpy()和2000个函数调用.
  2. 如果你想避免成千上万的调用,你将不得不使用指针.
  3. 但指针是:危险等等.实际的智能指针对你没有帮助,它们解决了其他问题.
  4. 目前没有解决方案.您必须不时为C++ RAII /指针/值变量设计付费.但是使用C++ 0x,使用unique_ptr将允许对象进行"大规模"移动(是的,实际上是对象,因为指针将是智能的)而没有"大规模"构造函数/析构函数调用,并且没有使用指针的风险!对我来说,这非常重要.

这就像放松RAII概念(因为使用指针)而不失去RAII的好处.另一个方面:包装在unique_ptr()中的指针将表现在许多方面,类似于java引用对象变量.不同之处在于unique_ptr()一次只能存在于一个范围内.


pax*_*blo 9

你的朋友部分正确,但大多数是错的:它是具有额外功能的相同语言.

好消息是,您不必掌握所有新功能.标准组织的主要任务之一是不破坏现有的代码,因此您将能够继续,快乐地使用旧式编码(即使我使用"C++"应用程序,我仍然主要是C编码器: - ).

只有当您想要查看新功能时,才需要了解更改.如果需要,这是一个可以延续多年的过程.

我的建议是要了解所有新功能的高级别(如果只是在求职面试中听起来知识渊博),但要慢慢了解细节.


Jam*_*kin 8

在某些方面,C++ 0x应该比当前的C++ 更容易教学/学习:

  • 循环通过容器 - 新的for语法比for_each+ functor或使用迭代器手动循环容易得多
  • 初始化容器:我们将能够使用与数组相同的语法初始化序列
  • 内存管理:外出肮脏的老auto_ptr,在明确定义unique_ptrshared_ptr

Lambda虽然必然比其他语言的等价物更复杂,但比在不同范围内定义函数对象的C++ 98过程更容易学习.


Ste*_*sop 7

您是否打算切换到新标准或遵守"旧"标准?

一年前,我正在编写严格的C89,因为有问题的产品可以轻松地移植到嵌入式平台上,其中一些编译器的编译器与C99的哪些内容完全不同,值得支持.因此,一个已有20年历史的标准仍未被其10岁的继任者完全取代.

所以我不希望能够很快摆脱C++ 03.

我希望在适当的地方使用C++ 0x功能.正如我在C代码中使用C99功能,以及在C和C++中使用gcc扩展(并且将使用MSVC扩展,尽管我从未在MSVC专用代码上工作超过微不足道的时间).但我希望它"很高兴"而不是基线,几乎是无限期的.


Dan*_*ker 7

你有一个观点,但情况一直如此.有很多C++代码仍然没有包含'98标准中的任何内容,只是因为某些程序员的固有保守性.我们中的一些人记得在std::命名空间之前的黑暗时间(实际上在命名空间之前),当每个人都编写自己的字符串类时,指针一直在裸露.我们之所以谈论"现代C++风格"是有原因的 - 要区别于早期风格,因为有些人仍然需要维护或更新该风格的代码.

任何语言都必须发展才能生存,任何演变的语言都会有一个划分的用户群,只是因为人们在估算将新语言功能应用于自己的工作时的机会成本方面存在差异.

随着C++ 0x在运输编译器中的出现,这个对话将在世界各地的开发团队中反复播放:

YOUNGSTER:我刚发现这些叫做lambdas的东西!而且我发现很多方法可以使用它们来使我们的代码更具表现力!看,我改写了你的旧Foo课,是不是更整洁?

OLDSTER:我的旧Foo课没有任何问题.你只是在找借口不必要地使用"酷"的新功能.你为什么一直试图让我的生活如此复杂?为什么我要继续学习新东西?我们需要另一场战争,这就是我们所需要的.

YOUNGSTER:你太困惑了,老头,这些天我们甚至不应该使用C++ ......如果这取决于我 -

OLDSTER:如果由我决定我们会坚持使用PL/1,但是没有......我的妻子不得不投票支持Carter,现在我们仍然坚持使用所有这些面向对象的垃圾.没有什么可以做的std::transform和lambdas,我不能做一个goto和几个标签.

等等


Mar*_*ram 5

您的编程生涯将始终涉及学习和重新学习.在退休并使用40年前使用的相同方法和实践之前,您不能指望c ++保持不变.技术滚动,它快速滚动.跟上它是你的工作.当然你可以忽略这一点,并继续以你现在的方式工作,但是在5/10年后你会变得过时,以至于当你试图改变工作时你将被迫学习它.这些年前,在工作中学习起来要容易得多:)