Hello:控制C++语言的标准体( SC22/WG21号机组 正处于修订C++语言的过程中——这一新的C++语言修订版,目前被称为C++0X,应该在十年结束时完成并予以批准。作为这个委员会最近会议(英国牛津附近)的一部分,在C++的-0X标准中,在当前的工作文件中添加了一些新的语言特征。
C++中的新字符类型
这将添加关键字char16u t和char32u t以及u“…”和u“…”以及u“
模板别名
这个特性已经出现了一段时间,最终被批准加入C++标准中。它允许以下代码:
#包括
模板
模板
MyVector
注意:在你的眼睛中,有可能注意到,上面例子中嵌套的模板参数列表以“>”而不是“>”结尾,这是因为对C++ -0x标准的第一个改变是,在关闭多个模板参数时,不需要在嵌套的“>”终止符之间插入空白。列表。
修改序列点
这不应该改变C++语言中的任何东西,它只是提供了更清晰的措辞——它去掉了“序列点”一词,而是描述了一个在操作B之前被排序的操作A(即,在执行每个表达式或语句之前,对函数调用的参数的估计进行排序)。函数体)或被取消排序(即,对函数调用的不同参数的求值是彼此取消排序的)。
希望本文能为未来C++内存模型的工作打下基础,尤其是并发方面。在即将召开的会议上,委员会应审查关于记忆模型和并发性的文件和提议的措辞。
可变模板
这是这次新增的最大功能。它允许以下代码:
模板
第十类:公共混合{
公众:
X(const Mixins&…Mixins):混合(Mixins)…
{
}
};
如果你在这门课上专门说:
A类{};
B类{};
C类{};
XX;
然后编译器将生成以下专门化:
X类:公共A、公共B、公共C{ 公众: X(A常数&u A,B常数&u B,C常数&u C):A(&u A),B(&u B),C(&u C)
{
}
};
这个特性对像tuple这样的类模板有很大的影响,根据Doug Gregor的说法,它可以极大地提高编译器的时间性能——因为编译器现在只需要处理一个类模板而不是N(我认为tuple的N通常是20)。此功能的一个无意的副作用是,它使以下内容格式良好:
类
结构X{ 空隙f(类型……);
};
是的,一排是六个。
随着这一特点得到批准,图书馆工作组继续进行工作,并更新了工作文件的图书馆部分,以适当利用可变模板。
允许sizeof应用于非静态数据成员
目前C++标准不允许如下:
结构{
内景m; };
尺寸(S::m)
这一特点使这样的代码合法化。
广义常数表达式
这项功能几乎被批准,但在最后一分钟核心决定撤回它。广义常量表达式如下所示:
constexpr int平方(int x)
{ 返回x*x;
}
在表达式的结果不是严格意义上的常量表达式的情况下(如位掩码),此功能确实很有帮助,例如。它包括一个演员;或者对于需要函数调用的情况,从而将静态初始化变成动态初始化(注意:我怀疑VisualC++将当前将这些动态初始化转换为静态初始化)。
出现的问题是,由于这些是常量表达式,它们作为非类型模板参数是有效的,但由于它们也是函数,因此在模板参数推导过程中可能需要编译器执行重载解析。这与 核心问题–339 它处理sizeof表达式中的函数调用。我们决定,Core将推迟批准广义常数表达式,直到这个问题得到解决——我们希望在下次会议上这样做。
SC22/WG21的下一次会议将于7月在多伦多举行。在这次会议上,希望委员会开始批准C++语言的一些较大的变化:这包括概念和内存模型/并发建议等特征。希望在多伦多会议之后,我能向大家介绍C++委员会的进一步进展。
乔纳森 洞穴