为什么我在了解C和C ++的情况下学习C ++ 11?[关闭]


28

我是C和C ++的程序员,尽管我不拘泥于两种语言,而是将两者混合编写。有时在类中包含代码,可能带有操作符重载或模板,如此出色的STL显然是一种更好的方法。有时,使用简单的C函数指针的可读性和清晰度要高得多。因此,我发现两种语言都具有美感和实用性。我不想讨论“如果将它们混合并使用C ++编译器进行编译,那么就不再是混合,而是所有C ++”,我想我们都理解混合它们的意思。另外,我不想谈论C与C ++,这个问题全都与C ++ 11有关。

C ++ 11引入了我认为对C ++的工作方式的重大更改,但是它引入了许多特殊情况,异常和不规则性,这些情况改变了不同功能在不同情况下的行为,对多重继承施加了限制,用作关键字的标识符,扩展字符串文字,lambda函数变量捕获等。

我知道在将来的某个时刻,当您说C ++时,每个人都会假定C ++ 11。就像如今您说C一样,您很可能是说C99。这使我考虑学习C ++ 11。毕竟,如果我想继续用C ++编写代码,可能只是因为我的同事在某些时候需要开始使用这些功能。

以C为例。经过这么多年,仍然有很多人在学习和编写C语言代码。为什么呢?因为语言很好。好的意思是,它遵循许多规则来创建好的编程语言。因此,除了功能强大(几乎所有编程语言都很容易实现或很难实现)之外,C还是常规的,几乎没有例外。但是,C ++ 11我不这么认为。我不确定C ++ 11中引入的更改是否会使该语言变得更好。

所以问题是:为什么我要学习C ++ 11?

learning  c++  c  c++11 

3
我知道在这个论坛上不应该有C ++ 11的喧嚣,对此我完全同意:每个开发人员都有权对编程语言和工具有自己的个人品味。但是,对我来说,还有一个实际问题:我是C ++开发人员,我不喜欢C ++ 11,我会被迫使用C ++ 11还是被淘汰出市场/切换到另一种语言?一些年?
乔治

好吧,我对此进行了思考,当然,还有更现代的从零开始的语言,例如D编程语言或Go。这些可能适用于您的问题领域,更容易实现一致性,等等。但是,市场份额..该行业的主要参与者都不支持D,甚至Go似乎都不是Google的“实验”之一。.因此,C +背后的动机+11应该是有用的改进,使您可以编写更好的可读性,更安全和更快的代码以及广泛的行业支持。
尼尔斯2012年

@giorgio,在过去的两年中,我像以前一样停止使用C ++(主要是因为意识到C ++爱好者的宗教信仰,正在阅读此问题的答案),但我仍然愿意在C ++库中工作,我愿意用于C ++ 11。我的经验是:C ++ 11解决了C ++的许多弊端,这令人钦佩,并且确实在此基础上有所改进。它的方式有其own脚的角落(请参阅原始未编辑的帖子)。但是,如果您以“正常方式”操作(例如,不存储lambda供将来使用),那么那些cr脚的角落似乎就挡不住了。

@giorgio,我的意思是,C ++ 11在一开始可能看起来很糟糕,实际上C ++本身看起来很糟糕,但是如果您对C ++没问题,那么您可能也希望C ++ 11。只需避免触摸其弯曲的部分,您可能会真正喜欢它。

@anon:摆脱一种语言糟糕的部分的一种方法是从过去切入,开始一种新的语言,就像苹果公司正在使用Swift一样(仅举众多例子之一)。与旧代码的接口可以通过单独的编译来完成。C ++的问题在于它会无限期地扩展,这可能是因为它得到了一群忠实拥护者的支持,他们坚信C ++是一种真正的语言。底线:我发现C ++ 03有点烂,但它完成了工作,尤其是感谢Qt和boost等库。另一方面,我将不使用C ++ 11。
乔治

Answers:


24

如果您认为将来需要了解它才能找到工作,则应该学习它。如果您有信心将自己作为C / C ++以及其他您可能知道的东西在劳动力市场中销售,那么就不要学习它。如果老板告诉您使用C ++ 11,请说“不,我不这样做”。如果他解雇了您,请去其他地方工作。当您预见到很快将无法以当前所掌握的技能找到满意的工作时,请学习C ++ 11。

想阐明我的理由:我不是反对C ++ 11。只是说您可以将OP的问题概括为“为什么我应该学习X”。我从未学过ML,scheme或haskell,因为我从事过C和C ++的工作。我确定这些语言对某人有用,但是它们对我现在学习没有帮助。如果有人给我很多钱来学习ML,我可能会尝试学习。


3
如果您是“ C / C ++”开发人员,并且如果老板告诉您使用C ++ 11,您是否不应该继续将其添加到您的武器库中?我同意您不应该为了学习语言而花费所有时间,但是当老板说“学习”时,继续学习可能是一个好主意。与不必在下一个应用程序中解释您因不服从而被解雇相比,这还使您更具市场吸引力。
Panzercrisis 2014年

Haskell ...有趣,因为在C ++中逐渐包含了lambda。:P
rbaleksandar '16

85

这很简单。C ++ 11极大地简化了代码,使编写过程更简洁,更快捷。

nullptr是对旧版本的VAST改进0。与类型不同,它是类型安全的,并且在不应该时不会进行转换0。这是一个很好的那个东西nullptr不会转换为int。完全没有任何意义。您知道C ++委员会在尝试考虑时发现了什么#define NULL nullptr吗?东西像char c = NULL;。那有多可怕?这里有一个例外的唯一原因是因为它bool被认为是整数类型,这是非常错误的-但是在C ++和C中就已经存在。nullptr不转换的事实是件好事,它很棒,您应该喜欢它。

还是右值引用和可变参数模板呢?更快,更通用的代码。那就是总的胜利。

图书馆的改善情况如何?像一样的东西functionunique_ptr并且shared_ptr比以前的东西要好得多,因此无法断言C ++ 03的方式更好。

#define adding_func(x, y) ((x)+(y))

甚至远非同等。宏由于60亿个原因而变坏。我不会在这里引用所有它们,但是众所周知,出于几乎可以避免使用它们的所有目的,应避免使用宏。你要怎么办

#define add_twice(x) (x + x)

哦,等等,希望您不要增加或增加任何东西x。模板功能版本完全不受哪个。我也希望您不要欣赏命名空间,例如。

然后,您将打开使用范围已完成的外部变量的未定义行为的世界。

在功能性API(例如STL算法)中,可以很好地进行引用。如果是存储的回调,则需要按值捕获。无论有关该功能的任何文档,都应明确指出哪些是必要的。代码是用lambda编写的,这与引用局部变量的问题无关。如果您传递常规函数对象,那么您将遇到同样的麻烦。这不是麻烦。完全没有 因为何时可以引用局部变量和不可以引用局部变量在本质上是显而易见的。

以C为例。经过这么多年,仍然有很多人在学习和编写C语言代码。为什么呢?

有很多人早上不刷牙。有许多凶手,强奸犯和妓女。和政客。自杀的人。您是否认为这会使这些活动变得好或有用?当然不是。这是一个逻辑上的谬论,仅仅因为有人做到了,所以它一定是好的或有用的。

仍在编写C的原因有三点:因为C ++是要在嵌入式或内核模式下实现的母狗;因为遗留代码库是用C编写的,因此升级成本太高,尽管考虑到C ++出色的C互操作性,这仍然是个问题。而且因为编写它的人不知道如何编程。而已。没有其他理由写C。

如果您使用C或旧风格的C ++,则不会发现很多异常。

作为一个简单的例子,可悲的C样式数组如何?无法直接获得数组和指针的人数是令人讨厌的。更不用说C标准库非常不安全的事实。

您的核心论点充满逻辑谬论和误解。


7
> nullptr不会转换的事实很好,这很好,您应该喜欢它。好的,您的意见是,但是请冷静一下其他人应该喜欢的东西……下一步是C ++律师塔利班主义!
Emilio Garavaglia

5
我认为答案的后半部分更多地是为什么C ++应该比C语言更受青睐。这是毫无疑问的。“ C库不安全”-这到底是如何回答这个问题的?我的意思是当然应该学习C ++ 11提供的新功能,但是C和C ++并不意味着要做相同的事情。如果说C ++只是低级实现的implement子,那么C#,Java,Python以及其他什么也不因为它们本来就不打算这么低。仅仅因为C ++编译为本地代码并不意味着您可以使用OO,并且对于关键的内核级代码,也可以使用OO和与之相关的页面颠簸。
yati sagade 2011年

11
@Shahbaz,显然,您必须了解有关编程语言(例如,类型系统,词法作用域等)的更多信息,所有注释完全不同步。开始与这本书:amazon.com/Theories-Programming-Languages-John-Reynolds/dp/...
SK-逻辑

5
@yati:C ++与C具有相同的模块系统。成员函数被实现为普通的旧C函数。虚函数的实现与从DLL加载函数的实现相同。没有关于这些的任何页面打动。是的,这绝对适用。首先,您认为Unix是最好的是主观的。5%的市场份额表明了另外的看法。其次,即使我无休止地崇拜Unix,一个例子也不会成为潮流。您引用的其他示例也是如此。有什么例子?他们没有意义。C ++与C一样适用于过程。
DeadMG

8
@yatisagade C ++是一种多范式语言,不能对所有内容强制使用虚函数,而且我在C ++中的程序也很相似。它的一部分使用面向对象的设计,部分使用功能等,具体取决于哪种方法可以最好地解决该特定子问题。感谢C ++添加了面向对象的样式,感谢C ++ 11大大扩展了对函数式编程的支持。
大卫·斯通

29

C ++ 11不是新语言;它只是您已经知道的C ++的扩展/修改。就像任何其他编程语言一样,C ++ 11也包含功能。他们中的许多人以前都在那里,其中一些是新来的。但是您的问题确实是,我应该学习该语言的所有功能(在本例中为C ++ 11),还是只熟悉90%的语言?

IMO即使您没有使用所有语言,也应该至少阅读一下这些新功能为您提供的服务。为了使库/框架代码(尤其是模板)的编写更加容易(例如,在C ++ 11不可能实现完美转发之前),引入了许多方法,但是如果您以前从未需要这些功能,那么您很有可能会获胜。没注意到这些功能是在C ++ 11中添加的。

另一方面,如果您以前曾尝试编写模仿某些STL / Boost功能的库/核心代码,却发现自己受到语言的限制,因为您95%都想拥有一个非常酷,优雅的解决方案,但是您被停止是因为您发现语言根本不支持您想要的语言,您将意识到C ++ 11的真正强大功能。自从我们的团队升级到VS2010(并在此过程中发现Boost)以来,我就能够编写出一些疯狂的超赞代码,而在进行r值引用和模板参数转发之类的事情之前,这简直是不可能的。

同样,lambda之类的东西可能看起来很陌生,但它们没有引入新的结构。相反,它们使我们以前拥有的东西变得更加容易编写。以前,每个lambda函数都必须是一个单独的类。现在只是{...代码...}。爱它。

关键是不要看这些功能,而要考虑列表的艰巨性。相反,请像往常一样使用C ++,当您遇到一些方便使用这些新C ++ 11功能的情况(超过90%的人永远都无法达到这一点)时,您会很高兴地看到该扩展语言已经完成。就目前而言,我建议您仅对语言有足够的了解,以了解其中的内容,而不一定是如何使用所有语言。


7
@Shahbaz-我认为您仍然缺少添加无名函数的意图。“使用变量而不将其作为输入”被称为闭包,并且在许多其他高级语言中也可用。如果您使用functor对象编写了许多模板代码,那么使用C ++ 11时,您将张开双臂欢迎lambda函数。这样想吧……当编译器生成机器代码时,就没有模板函数或类之类的东西。在此之前,它们都被“实例化”以创建具体的类/函数。当涉及有状态时,Lambda就是一回事……
DXM

5
...功能 C ++ 11允许您指定一种快捷方式语法,而不是让人们编写大量的代码,而是为每种类型的仿函数和要传递的每个闭包元素都编写一个代码,它将自动实例化整个内部仿函数类,就像它实例化模板。再次,请记住,大部分的这些功能将不会在应用级代码98%被使用,但加入他们做出那样STL / Boost库是更强大和更容易实现/维护/调试
地塞米松

10
@Shahbaz:好的,您不了解lambda函数或闭包。那是合理的。它们在许多种不同的语言中使用的事实表明,不管您是否理解它们,它们都非常有用,并且在对它们进行过多批评之前,您应该了解它们。
David Thornley

8
@Shahbaz:如果您认为闭包类似于全局变量,则您不了解闭包。(提示:全局变量会导致问题,因为任何函数都可以修改它们。)如果您了解lambda的概念,而不是实现的概念,则不会将其归因于类与代码的混淆。C ++标准中的所有内容都是出于令人信服的众多原因而制定的。您不必同意这些原因,但是如果您不了解这些原因,您就会因为无知而受到批评。
David Thornley

6
@Shahbaz, 闭包和全局变量之间绝对没有相似之处,您完全忘记了这一点。阅读:en.wikipedia.org/wiki/Lambda_calculus并炸毁你的大脑:en.wikipedia.org/wiki/Combinatory_logic
SK-logic

18

编写函数是否如此困难,以至于除了不给它命名之外,还必须与代码内联编写函数的内容?

这样做时,您可以向上滚动,或打开一个新的源文件并在其中添加函数的定义。然后,您必须返回并继续进行工作,这在一定程度上分散了您的注意力。

除此之外,当其他人正在阅读您的代码时,在某些情况下,lambda可能更能自我记录,而不是说“哦,此功能做什么?” 然后跳转到它的声明,您可以看看它在自己的地方正在做什么。

赫伯·萨特(Herb Sutter)有一个关于lambda的精彩演讲,也许他可以说服您更好:

http://channel9.msdn.com/events/PDC/PDC10/FT13

好吧,为什么不在那里直接编写代码而不是将其变为lambda函数呢?

因为当您使用STL算法或正在使用的任何需要您传递函数的函数时无法执行此操作。

#定义adding_func(x,y)((x)+(y))

没有办法代替lambda来证明这种用法的正确性,您无法在各处都用宏填充代码。宏和函数具有不同的用途,通常一个宏不能替代另一个宏。

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

我同意,这很丑。但是我记得自己曾说过:“即使编译器可以推断出这个表达式的类型,为什么还要弄清楚它的类型?” 在很多情况下。在那一刻,这可能会有所帮助。

总结一下:

尽管C ++ 11的新功能在语法上看起来很丑陋,但我认为人们可以在短时间内习惯它们。一开始,每种新的语言结构都很难学习。想像一下您第一次学习编写整个类:将声明放在头文件中,不要忘了最后的分号,将定义放在源文件中,包括头文件,同时确保它有防止多个包含,不要忘了成员函数声明中的作用域解析运算符,等等。

但是我很确定,在编写了几个类之​​后,您就会习惯它,并且您不会考虑此过程的复杂性:因为您知道一个类会使您作为程序员的工作变得更加轻松,并且您会发现实用程序从这种新结构中获得的收益远远大于您尝试学习这种语言时的效用损失。我认为这可能就是为什么人们应该尝试学习或以类似方式使用C ++ 11的原因。


关于自我记录和更少滚动的争论,我敢肯定,曾经有相反的争论,例如“混乱的代码”,“限制访问”等曾经被用来争论为什么必须禁止类外的函数。我认为人们需要更多的经验来决定哪个更好。在我看来,这要么是失败的实验,要么是糟糕的设计。我更坚信在这项实验中不要成为实验老鼠。
Shahbaz的

关于看起来很难看的语法,请以这两个为例:bool is_alive;bool thisSpecialObjectOfMineIsAlive;。两者都一样,但是第二个看起来确实很难看。为什么?因为我错误地认为放置更多信息可以使它更清晰,但是却相反。这是同一笔交易,Stroustrup通过为我们提供功能来表示很好,但是他只是没有让它看起来好看。对我来说,这表明设计不好。
Shahbaz的

3
好看!=好,坏看!=不好。
DeadMG

@Shahbaz:我认为lambdas是一个很棒的概念(在Lisp等语言中已经存在了很多年)。我在Haskell中经常使用它们。我不太确定它们是否适合C ++,Java等语言。它们对我来说有点像事后思考:后来由于lambda变得流行而添加了一些东西。为什么从一开始就不采用这些语言进行介绍?Stroustrup和Goslin从未听说过Lisp吗?
乔治

8

实际上,就大多数答案而言,OP有一些要点。但是它们在视觉上“遥不可及”。C ++(包括C子集)具有悠久的历史,在此期间已添加了许多功能,其中一些功能或多或少地频繁使用,并且通过使用和错误完善了其他功能。

有时会发生,在引入新功能后,不再需要旧功能,或者感觉与之矛盾。一种“干净”的语言应保持原样,并且不再删除任何需要的功能。

但是添加不会破坏任何东西。删除(或更改)会破坏仍在生产中的现有代码,因此,无论添加什么功能,都必须注意不要破坏现有的代码(尤其是不要默默地破坏它,从而使其按预期方式做不同的事情)。

您需要学习所有这些吗?是的,因为早晚都使用了所有功能,无论是好是坏。这对语言“质量”是否有利(承认有客观的衡量标准)是另外一个故事:向后兼容性应保留多长时间?当有人说3年而另一些人说50岁时,很难找到答案。

保持C ++更加“常规”的替代方法是...更加频繁地中断它,并从头开始。但这将不再是C ++。

也有尝试这样做(例如,想到D:实际上比C ++(甚至11)正交得多),但是它们有多受欢迎?它们难以获得动力的原因是与仍然必须运行的许多现有代码不兼容。

对我而言,C ++ 11显然是新需求与向后兼容性之间的折衷。这导致其规范和实施有些“混乱”。直到那种“麻烦”的代价小于不兼容的代价为止……您必须舍弃这种妥协。

如果您再也无法忍受它,...最好考虑使用另一种较年轻的语言。从这个意义上讲,C ++根本无法简化。不在这个年龄。


我也同意。作为一名开发人员,我发现令人不安的是,语言一直在变化(我必须一次又一次地学习)。如果您开发一种新语言,则应该重新开始并使用其他名称。如果您希望它与遗留代码配合使用,则可以为此单独编译。因此,我真的不理解通过合并已经流行的最新功能来更改现有语言的策略。就像有人说的那样,进一步的发展并不自动意味着进步。
Giorgio

“从这个意义上说,C ++根本无法简化。在这个时代还没有。”:为什么其他编程语言(例如C,Ada等)也没有遵循同样的道路?也许是因为它们具有自己的应用程序利基,并且不希望它们成为所有可能应用程序领域的工具。
乔治

@giorgio:是的……您可能在“务实”的意义上是正确的。但是从理论上讲……我记得有些美好的日子,其中pascal是“教学参考语言”,而ada是“ 想要的一切编程语言”。
Emilio Garavaglia'4

我还学习了Pascal编程。据我所知,Ada进行了多次修订,但该语言的基本设计并未被颠覆。C和Pascal相同。如果要开发一种真正新的语言,则应该勇于做出明确的决定并开始一些新的工作,例如D,Java,C#。C ++当前路径的问题是(不必要)变得过于复杂。如果KISS和YAGNI原则适用于软件设计,为什么它们也不应适用于编程语言设计?
乔治

@Giorgio:哦,他们……完全按照您说的那样适用。如果您认为C#或D比“煮熟的” C ++更好的选择(我对您的感觉的解释),只需使用它们代替C ++。随着时间的流逝,C ++会慢慢消失。现在,我看到C ++ 11为“煮熟的” C ++ 03提供了新的机会,而D仍然缺少一些突破起始障碍的机会。经济学和公司利益在融资和鼓励发展的方式中也发挥着作用。您理论上是正确的,但现实世界要复杂得多。
Emilio Garavaglia'5

7

即使您决定忽略C ++ 11的新功能,您仍然会从中受益,因为C ++标准库将使用它们。例如,在C ++ 98中,类型变量vector<string>是潜在的性能损失,因为向量增长时需要制作副本的数量。对于C ++ 11 move构造函数,这不是问题。实际上,我希望C ++ 11为我们带来更多而不是更少的新功能-特别是在标准库中。


6

经过这么多年,仍然有很多人在学习和编写C语言代码。为什么呢?因为语言很好。

首先,如今大多数学生正在学习Java或.NET,而不是C。其次,人们之所以仍在使用C,不仅是因为C作为语言的优势,而且主要是因为有大量用C编写的现有软件需要可以进行维护和扩展,并且因为在许多情况下(例如嵌入式平台),都只有C编译器。顺便说一下,这些是人们仍然编写COBOL的一些原因。

对于行业中的程序员而言,很少会开始从事与现有代码库无关的全新项目,并继续独自工作。因此,学习C ++ 11的原因是您可能必须处理使用新功能的其他人编写的代码。另外,添加功能是有原因的。一旦学习并使用它们,您可能会喜欢它们。


您未完整引用我的句子。就像我在后面的句子中所说的,good意味着它遵循良好的编程语言设计规则。我不知道您在哪里学习,但是我知道有4个或5个国家,并且它们都开始学习C语言。就像我说的那样,C语言几乎没有例外(Java中与之相反的地方,您几乎不能找到没有异常的构造)。
沙巴兹(Shahbaz)

1
@Shahbaz:我引用了完整的句子。您建立了因果关系,我说这充其量是不完整的。值得庆幸的是,我不再学习了。:)我已经做够了。我住在美国,上大学时(超过15年),C是入门语言。但是,如今,大多数美国学校都是以Java开头的,而且不懂C的年轻程序员也不多
。– Dima

5
@Shahbaz:我真的没有看到语言规则有例外的问题。是的,C是比C ++简单得多的语言。另一方面,C ++使编写更简单的代码变得更加容易。要编写更简单的代码,您需要更多的语言功能。这使语言更加复杂。首先,我喜欢类,引用,RAII,模板,构造函数,析构函数,异常和名称空间之类的东西。但是您说您的问题不是关于C vs C ++的,所以我没有在答案中写这个。
迪马

5
  • 创建汇编是因为人们不喜欢编写机器代码
  • 创建C是因为人们不喜欢编写汇编
  • 创建C ++是因为人们不喜欢编写C
  • 创建C ++ 11是因为人们不喜欢编写C ++

在C ++生涯中,您将对自己说:“我希望希望函子更简单”“为什么NULL是int?” 然后您将了解C ++ 11。


之所以创建所有语言,是因为有人不喜欢现有的语言。那没有使他们好。
Shahbaz的

我不是说NULL应该是一个int。不应该这样 我觉得不合适的是用一种可以解决此问题的语言介绍一种构造,但是引入了异常。他们应该能够以更好的方式做同样的事情。
Shahbaz

2
“创建C ++ 11是因为人们不喜欢编写C ++”:如果他们不喜欢编写C ++,为什么C ++是C ++ 11的子集?
Giorgio

1
应该是:C#和Java的创建是因为人们不喜欢编写C ++。
Calmarius 2012年

4

学习总是有益的。知识就是力量。

基本上,这就是答案。其他所有内容都只是有关如何从中受益的详细信息以及通过了解它所拥有的力量的细节,而且它们是如此之多,以至于任何枚举都不完整。

一个例子是你自己的问题。如果不学习至少一点,您将甚至无法提出。

正如我评论的那样,真正的关注点不是为什么要学习,而是为什么要使用。这是一个完全不同的问题。


4

您应该学习C ++ 11,因为添加的功能使您可以编写更好的代码。有人提到了NULL指针和lambda的类型安全性,这非常好。但是我想引起我的注意,我认为这是C ++ 11中最重大的变化,特别是在大型生产环境中:移动语义。

C ++ 11支持“移动”和“复制”的单独概念。在常规C ++中,我们只有=运算符,基本上可以完成这两个操作。但是实际上,我们正在与一位操作员一起表达两种不同的想法,这很危险。

最有用的最明显的例子是新的unique_ptr。它具有旧版auto_ptr和scoped_ptr的所有最佳功能。假设我们要确保有一个指针是唯一指向对象的指针。我们如何处理a = b?好吧,在我们陷入困境之前,您可以完全禁止使用它(如scoped_ptr),也可以在a = b从b窃取所有权的情况下执行auto_ptr的操作。auto_ptr的这种行为非常令人困惑,因为a = b实际上会改变b。unique_ptr处理此问题:不允许a = b,但是您有一个= std :: move(b)可以窃取所有权。这有什么用?那里,有一个单独的(重载)交换版本,它使用移动语义而不是复制语义。这意味着可以交换unique_ptr,没问题。这意味着unique_ptr与auto_ptr不同,可以在容器中安全使用,然后说排序。当您不需要在同一对象上使用多个指针时,unique_ptr基本上就是安全内存管理的全部和全部。

另一个很好的例子:假设您有一个不可复制的对象。这在许多情况下很有用。您永远不能从函数返回此对象,因为当函数结束时,它会复制出您要返回的内容。具有讽刺意味的是,通常编译器实际上对此进行了优化(即,最后没有实际复制任何东西,在最终分配的地址处创建了返回值)。但这与为什么我们使它不可复制无关。从函数返回实际上只是将对象从内部函数范围移到外部。现在,您可以编写不可复制但可以移动的对象,并且可以从函数中返回这些对象。

移动语义使编写不会泄漏且线程安全的代码变得更加容易。


而且,顺便说一句,高效。
尼尔·弗里德曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.