Questions tagged «c++11»

C ++ 11是2011年批准的C ++标准的名称。它取代了以前的C ++ 03标准,添加了各种核心语言更改和修补程序以及改进和扩展的标准库。

3
C ++ 11统一初始化是否可以替代旧式语法?
我知道C ++ 11的统一初始化解决了该语言在语法上的歧义,但是在许多Bjarne Stroustrup的演示文稿中(尤其是在GoingNative 2012演讲期间的那些演示文稿中),他的示例现在在构造对象时主要使用此语法。 现在是否建议在所有情况下都使用统一初始化?就编码风格和一般用法而言,此新功能应采用的一般方法是什么?什么原因不使用它? 请注意,在我的脑海中,我主要以对象构造作为用例,但是如果要考虑其他场景,请告诉我。
172 c++  c++11 

11
我应该停止使用术语C / C ++吗?
我了解C和C ++是不同的语言,但是当我学习C ++时,总是被告知C是C ++的子集,或者C ++是带有类的C。在C ++ x0,C ++ 11(或现代的C ++ 11/14/17)问世之前,这都是事实。实际上(特别是在嵌入式系统上工作时),很可能会发现用C ++编写的代码,但是很多部分完全是用纯C语言编写的。这里我有几个问题: 我应该停止使用术语C / C ++吗? 如果对#1的回答是肯定的,那么我将如何调用混合使用C和C ++的程序? 鉴于这两种语言都是“不同的”语言,C ++编译器很可能在某些时候停止支持用C语言编写的代码(因为现代c ++在指针,动态内存处理等基本内容上与C思维方式有所出入) 现在制定C / C ++标准的人员之间是否存在任何协作以保持兼容性 如果#4是肯定的,那么这种合作可能会在不久的将来随着现代c ++的出现而结束(11/14/17) 我知道已经有类似的问题,但是我敢肯定,很多人都会分享这些问题,因此我非常有兴趣获得良好的答案,尤其是在不久的将来与C ++趋势有关的观点。
140 c++  c  terminology  c++11 

14
自动会使C ++代码更难理解吗?
我看过Herb Sutter的一次会议,他鼓励每个C ++程序员使用auto。 前段时间,我不得不阅读C#代码var,该代码被广泛使用,并且代码很难理解-每次var使用时,我都必须检查右侧的返回类型。有时不止一次,因为一段时间后我忘记了变量的类型! 我知道编译器知道类型,而不必编写它,但是我们应该为程序员而不是为编译器编写代码已广为接受。 我也知道这更容易编写: auto x = GetX(); 比: someWeirdTemplate<someOtherVeryLongNameType, ...>::someOtherLongType x = GetX(); 但这仅写入一次,并且GetX()多次检查了返回类型以了解其类型x。 这让我感到奇怪-是否auto会使C ++代码更难理解?
122 c++  c++11 

7
在C ++中将作用域枚举用于位标志
一个enum X : int(C#)或enum class X : int(C ++ 11)是具有一个隐藏的内部场类型int,可容纳任何值。另外,X在枚举上定义了许多预定义的常量。可以将枚举转换为其整数值,反之亦然。在C#和C ++ 11中都是如此。 在C#中,按照Microsoft的建议,枚举不仅用于保存单个值,而且还用于保存标志的按位组合。此类枚举(通常但并非必须)用[Flags]属性修饰。为了简化开发人员的工作,按位运算符(OR,AND等)被重载,因此您可以轻松地执行以下操作(C#): void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 我是一位经验丰富的C#开发人员,但是现在仅对C ++进行了几天的编程,并且不了解C ++约定。我打算以与C#中使用的完全相同的方式使用C ++ 11枚举。在C ++ 11中,作用域枚举上的按位运算符没有重载,因此我想重载它们。 这引发了一场辩论,意见似乎在以下三种选择之间有所不同: 枚举类型的变量用于保存位字段,类似于C#: void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); 但这会违背C ++ 11范围枚举的强类型枚举哲学。 如果要存储枚举的按位组合,请使用纯整数: void …

9
std :: shared_ptr作为最后的手段?
我只是在观看“ Going Native 2012”流,并且注意到有关的讨论std::shared_ptr。听到Bjarne std::shared_ptr对此持否定态度,以及他的评论是当物体的寿命不确定时应将其用作“最后手段”时,我感到有些惊讶(我认为,他认为这种情况很少见)。 有人愿意进一步解释这一点吗?我们如何std::shared_ptr在没有安全的情况下进行编程并仍然可以安全地管理对象的生命周期?

13
未定义行为背后的哲学
C \ C ++规范为编译器以自己的方式实现提供了许多开放的行为。这里经常有很多问题被问到同样的问题,并且我们有一些很好的帖子: https://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-abo https://stackoverflow.com/questions/4105120/what-is-undefined-behavior https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points 我的问题不是关于不确定行为是什么,还是真的不好。我确实知道该标准的危险和大多数相关的未定义行为引用,因此请不要发布有关该标准有多严重的答案。这个问题是关于为编译器实现留出许多行为的背后的哲学。 我读了一篇很棒的博客文章,指出性能是主要原因。我想知道性能是否是允许它的唯一标准,或者是否有其他因素会影响将事情开放给编译器实现的决定? 如果您有任何示例可以引用某个特定的未定义行为为编译器提供足够的优化空间,请列出它们。如果您知道性能以外的其他因素,请提供足够详细的答案。 如果您不理解该问题或没有足够的证据/来源来支持您的答案,请不要发布广泛猜测的答案。

3
C ++强类型typedef
我一直在尝试一种声明强类型typedef的方法,以在编译阶段捕获某些类的错误。通常,我会将int类型定义为几种类型的id,或者将矢量类型化为位置或速度: typedef int EntityID; typedef int ModelID; typedef Vector3 Position; typedef Vector3 Velocity; 这可以使代码的意图更加清晰,但是经过一整夜的编码之后,人们可能会犯一些愚蠢的错误,例如比较不同类型的id或在速度上增加位置。 EntityID eID; ModelID mID; if ( eID == mID ) // <- Compiler sees nothing wrong { /*bug*/ } Position p; Velocity v; Position newP = p + v; // bug, meant p + v*s but …
49 c++  c++11  type-safety 


10
我是初学者。我可以直接开始学习C ++ 11吗?还是我必须学习旧的C ++?[关闭]
我是一个初学者,对编程只有很少的知识。 如果我直接从涵盖新C ++ 11的书中学习C ++,还是应该学习旧的最好的C ++书,那会很好吗? 在学习C ++ 11之前,我应该对C ++有所了解吗?还是我可以直接从那里开始? 如果我直接从C ++ 11开始,会引起问题吗?如果否,则建议一些有关C ++ 11的书籍。
36 c++  c++11 

4
如何切换到C ++ 11?
我已经用C ++编程了一段时间了,但是大多数事情都围绕着C ++的低级功能。我的意思是主要使用指针和原始数组。我认为这种行为被称为将C ++与类一起使用。尽管如此,我最近才第一次尝试C。我很惊讶地发现C#和Java之类的语言如何在便捷的标准库类(如字典和列表)中隐藏这些细节。 我知道C ++标准库也有许多容器,例如矢量,映射和字符串,而C ++ 11仅通过具有std :: array和ranged循环来增加了它。 我如何最好地学习如何利用这些现代语言功能以及哪些功能适合哪些时间?如今,C ++中的软件工程大部分都不需要人工进行内存管理吗? 最后,我应该使用哪个编译器来充分利用新标准?Visual Studio具有出色的调试工具,但即使VS2012似乎也具有糟糕的C ++ 11支持。
35 c++  c++11 

3
C ++ 11是否解决了在动态/共享库边界之间传递std lib对象的问题?(即dll等)?
我对C ++的主要抱怨之一是在实践中将标准库对象传递到动态库(例如dll / so)边界之外有多么困难。 std库通常是仅标头的。这非常适合进行一些很棒的优化。但是,对于dll,它们通常是用不同的编译器设置构建的,这可能会影响std库容器的内部结构/代码。例如,在MSVC中,一个dll可能会在打开迭代器调试的情况下构建,而另一个dll会在关闭调试器的情况下构建。这两个dll可能会遇到传递标准容器的问题。如果std::string在界面中公开,则不能保证客户端使用的代码与std::string库的完全匹配std::string。 这导致难以调试问题,头痛等。您要么严格控制组织中的编译器设置以防止出现这些问题,要么使用没有这些问题的更简单的C接口。或向您的客户指定他们应使用的预期编译器设置(如果另一个库指定了其他编译​​器设置,则很糟糕)。 我的问题是C ++ 11是否试图做任何事情来解决这些问题?
34 c++  libraries  c++11 

3
如果Windows上没有线程支持,GCC会死吗?[关闭]
我需要一些意见。GCC一直是一个非常好的编译器,但是最近它失去了“吸引力”。我刚刚发现Windows上没有GCC std::thread支持,由于仍然缺少最激动人心的功能,因此迫使Windows用户使用其他编译器。 但是,为什么GCC确实在Windows下仍然没有线程支持?许可问题?ABI不兼容?(嗯,已经有几个使用多线程的跨平台库:boost,POCO,SDL,wxwidgets等。使用已经存在且已获得MIT / libpng许可的代码来适应这个漏洞而不是发布GCC版本不是很简单吗?没有线程支持?) 最近,通过对编译器的比较,GCC对C ++ 11功能的支持比其他编译器要大,除了在Windows上这不是事实,因为我们仍然缺少原子,互斥体和线程:/ 我想了解更多有关此主题的信息,但我唯一能找到的人是寻求帮助的人,因为: std名称空间中不存在“线程” 从GCC / TDM-GCC的票务跟踪和邮件讨论开始,自2009年以来就一直在寻求线程支持的请求。可能在4年后仍然没有解决方案吗?到底发生了什么事?

5
C ++样式指南[关闭]
现在,我在C ++代码中使用了Google C ++样式指南,对此我感到非常满意。 最近有人告诉我,该指南非常糟糕:Google内部使用(我知道),该指南已经过时,并且推广了一些非常糟糕的做法。所以我想使用另一种编码风格。 有哪些良好且使用合理的C ++样式指南?我为gcc和Visual Studio编写代码,并且使用了许多C ++ 11功能。 我最喜欢Google C ++样式指南的是缩进,空格和命名约定(特别是所有类,类型(包括typedef,类型别名和模板别名)都以大写的首字母命名)。 我知道任何答案都是主观的(希望在此站点上可以),并且希望您提出任何意见,但我对最近使用的指南很感兴趣。

10
为什么我在了解C和C ++的情况下学习C ++ 11?[关闭]
我是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?
28 learning  c++  c  c++11 

8
弃用是否有害?[关闭]
我一直-std=c++0x在用GCC中的标志编译自己的代码,因为我想隐约地跟上所有年轻人的行为(前提是他们留在草坪上),最后我得到了很多警告关于auto_ptr被弃用 当然,我知道auto_ptr在C ++ 0x 中已弃用,但是... 弃用不是浪费时间和精力吗?不弃用的原因(以auto_ptr为例): 仍然有大量代码需要得到支持,产生数百万条警告只会诱使人们关闭警告。 auto_ptr 是个小问题,但实际上确实可以做到。 如果我们真的想弃用东西,我提名printf()。但是,请想象将会发生的尖叫声。auto_ptr没有太多的朋友,但是至少在我的C ++代码中,它的使用量大于printf,根本没有使用。 该委员会对此有不好的记录-他们在名称空间范围内弃用了static,现在似乎已经弃用了-如果auto_ptr做出类似的复出,我不会感到惊讶 最后,无论委员会怎么说,编译器实施者都不会理ignore它们-他们根本不能冒险破坏客户代码,他们所能做的就是发出令人讨厌的警告。 所以我的问题是-您是否认为弃用(任何东西,不仅是auto_ptrs,而且不只是C ++)是个好主意,如果可以,为什么?

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.