我们最喜欢的C ++ 0x功能是什么?
正如我们许多人所知(很多人还不知道),C ++目前正在为国际标准的下一修订版进行最终起草,预计将在大约2年后发布。目前可从委员会网站上获得草稿和论文。各种新功能都被添加,最大的是概念和lambda。 Wikipedia上有一篇非常全面的文章,其中包含许多新功能。 GCC 4.3和更高版本实现了一些C ++ 0x功能。
就新功能而言,我真的很喜欢类型特征(以及适当的概念),但是我绝对的领导者是可变参数模板。直到0x为止,长模板列表通常涉及Boost Preprocessor,并且编写起来非常不愉快。这使事情变得容易得多,并允许使用可变参数模板将C ++ 0x模板视为功能完善的语言。我已经用它们编写了一些非常酷的代码,我迫不及待地想更频繁地使用它们!
那么,我们最期待的功能是什么?
解决方案
可变类型推断的自动关键字
线程和原子。
对于现在的多核处理器,规范C ++ 0x应该是C ++ 07.
G。
Lambda和初始化程序列表。
而且,所做的更改使最终将C ++引入垃圾收集模型变得更加容易,这些更改似乎很有趣。也许C ++ 1x实际上会带来垃圾回收,但是0x / 10只是为可能的事情做准备。
对我关闭。
自动关键字
unicode,多线程,hash_tables,智能指针和正则表达式。
ps:不知道为什么他们不能进行gr8代码审查,并接受所有boost和tr1库纳入标准,并使每个人的生活更轻松。然后,他们所要解决的就是在一个可行的可选垃圾收集模型上达成一致。
我想要参考值。
所有其他新功能都是我们可以轻松生活的东西(alas功能)。但是,到目前为止,C ++中缺少Rvalues已导致成百上千的模板库作者不得不"破解"破碎的Rvalue ref问题。
为我代代相传。但是初始化列表,lambda和可变参数模板紧随其后。
- 它必须包含一些Boost库(shared_ptr <>并绑定在列表的顶部)
- 对模板实例化的控制最终应该解决巨大的编译时间问题,并使在大型项目中使用现代模板代码实际上可行。
- 模板typedefs
许多其他小的但重要的事情,但它们在生产代码中确实很重要。
Lambda和概念
我无法在Null指针类型,元组类型或者正则表达式之间做出选择。 " Foreach"也在那里。 '智能指针'不用说... :-)
基本上,我真的很期待更新。
我个人认为大量使用null指针类型会引起很多错误。元组非常适合处理关系数据。很多很酷的东西。
可变参数模板! (将其与r值引用结合起来可以为我们提供完美的转发!)
语法越来越糟。
可变参数的模板和lambda很不错,尽管不幸的是两者的语法都令人反感。
智能指针。不必显式地管理堆分配的对象,这确实带来了很大的变化。
显然,我们仍然需要"知道自己在做什么",但是以我的经验,它已经减少了与内存相关的错误的数量,至少减少了我使用过的软件的一个数量级。
它不大,但是我喜欢真正的nullptr的想法。应该是git-go中的关键字。
我喜欢constexpr,尤其是与可变参数模板和用户定义的文字结合使用时,我们终于可以拥有二进制文字和许多其他东西了。
obj.bitmask |= 00001010B;
强类型枚举得到我的投票。 Pascal仅仅拥有这些已有40多年了,因此很高兴看到C ++终于赶上了。
但是,该标准的发布实际上不是一件小事。更重要的是,实际使用的工具链实际上完全可靠地支持了我们要使用的功能。有些人似乎实际上很喜欢编写符合标准的代码,但这些代码无法在任何已知的编译器上进行编译。祝他们好运。
正则表达式!和并行编程库,尽管我还不了解它们的全部功能。
原始字符串文字!我以为类似python的字符串块很棒,但是我错了!在C ++ 0x中,原始字符串文字对于文本格式非常有用。标记语言可以直接在源代码中编写!
嵌套模板声明中的尖括号。
这样我就能写
std::vector<std::vector<int>> a;
而不是可怕的
std::vector<std::vector<int> > a;
decltype :-)和lambdas
就目前而言,我非常喜欢我玩过的C ++ 0x:
- nullptr
- static_assert
- Lambdas
- shared_ptr和weak_ptr
- unique_ptr
- 十进制类型和自动
我还没有尝试过<regexp>。。。我认为这是一个很大的主意。。。但是我什至没有花时间去研究它。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我认为for(auto x:collection)
迭代语法非常酷...它实际上将许多循环头的大小减少了4倍或者更多(迭代器类型通常...冗长)!
这也意味着我们不必在循环体内取消对迭代器的引用(对于传统的迭代器循环,我们始终必须使用* i
或者i-> ...
来获取元素的值) ,但是在这里我们可以只使用x
),这在某些情况下使代码看起来更好。