这是我对当前在厄巴纳举行的C++委员会会议上的提案方面文章的第三部分。 这次是全部关于子组变革的,对这方面,我写了很多文章,所以这仅仅是第一部分。 前面那些部分是关于并发(concurrency)的, 然后 第二部分是关于核心,网络,模型以及未定义行为方面的。 变革 N4126 - 显式默认比较操作符这个提议已经在上一部分的反射部分提到了,在那里我们用反射和std::tie解决这个问题。这份提议想让 = default变得合法; 对于所有的操作符 (>,<,==,!=, ...)。这些操作符仍然使用友元方法来实现,如下例所示:
N4127 - 检查后的解引用条件因为已经提议过有范围的for(ranged-for)循环,这个提议转移到auto和默认类型.如果没有提供类型,它也希望,在其它语句中,引进或采用有范围的for的语法,使之合法,例如if语句:
对于C++来说,这是一个巨大的改变,并且不是每个人都喜欢它,特别地,编译器的创建者不得不处理这所波及的范围.然而,如果委员会认可了下个版本的有范围的for循环,那么在其他C++控制结构,如if,while,for等,中允许同样的语法也就说得通了. N4131 - 显式的绝不应该是隐式的这篇文章对应的是N4074,它争论提议的变化内容,即让{expr}显式的返回是错误的,因为显式的决不应该是隐式的.关于草案中的更多细节,作者甚至给出了一个例子,说N4074提案可能导致未定义的行为. N4135 -运行时按规定校验的语言支持 (修订8)作者提供了很好的概述:
N4147 - 内联变量,或封装表达式作者再一次提供了很好的概述:
N4148 - 不允许来自易拷贝类型的不可访问操作符当前对于易拷贝类型(trivially copyable type)的定义有一个缺陷:它对于不可访问的/删除的 拷贝/移动 构造函数和赋值操作符同样有效.一个易拷贝对象也可以通过使用std::memcpy来拷贝,特别是当有一个易拷贝对象数组的时候,这在性能上更优.然而,对于一个删除的/不可访问的 拷贝/移动 构造函数或者赋值操作符,这样做是不明智的.作者提议更新标准里面的措辞,并提高特性,让std::is_trivially_copyable针对不可访问的/删除的 拷贝/移动 构造函数和操作符返回错误. N4149 - 明确且合适的类同样的,这篇文章也有很好的概述:
N4150 - 别名集合属性: 针对C++中restrict一样的别名语义这个提议想增加restrict修饰符到C++,因为它已经存在于C99之中,同时,一些编译器已经提供了restrict作为一个C++拓展。由于目前没有定义restrict修饰符,作者寻求定义如何正确的使用它,特别是在C++ 11中像lambda一样的特性。 N4152 - 未捕获的异常这篇文章想提高std::uncaught_exception的可用性:
N4154 - 操作符断言这个提议想让assert(断言)成为语言结构,而不是一个宏定义:
N4160 - 值约束这篇文章分析了如何在C++中支持契约式编程(contract programming)风格的特性.它尝试着提供一个概况,关于如何在编译时而不是运行时检查的时候支持契约.作者定义了文档的范围,如下:
N4164 - 前向引用作为正式的通用引用, 类型T&& 总是右值(r-value)引用,除了作为模板参数或者使用了auto关键字。技术上仍然是右值引用,但是在这种情况下,表现上是非常不同。到目前为止,标准不识别这点,作者想介绍这个术语前向引用(forwarding reference),关于在模板和auto关键字之中的右值引用。 N4165 - 统一调用语法成员函数的调用语法是x.f() 或者 x->f(),而非成员函数则是f(x).这在泛型编程代码中会是一个问题,因为没有统一的调用语法,而泛型编程代码必须决定是调用成员函数还是非成员函数。 为了解决这个问题,作者提议允许使用语法x./->f()来调用自由函数,如果函数的第一个参数是x的指针或者引用。这也很好的满足C的用法,当函数第一个指针参数是一个结构体的时候。作者使用FILE*和fseek作为例子。 N4166 - 可移动的初始化列表当前,std::initializer_list不是可移动的,它是在移动语义变得重要之前设计的.同时,那个时候只提供拷贝语义看起来是足够的,但是今天的情况已经发生了变化.作者提议一个模板化版本的std::intializer_list,它继承于非右值intializer_list类型: template< typename T > struct initializer_list< T && > : initializer_list< T > { 这个构造实现了所有权和移动语义. N4172 - 命名参数命名参数的语法看起来和提议中的 "有范围的for(ranged-for)循环" 类似。但是在近似(几乎一样)的语法表达下面,两者有不同的意义。在一个函数调用过程中,你可以像下面例子中这样对命名参数赋值:
在这个例子里面的函数调用过程中,参数z的值是30, 参数x的值是40。另外,非命名参数不能放在命名参数之后。 N4173 - 点操作符同样的,这篇文章也有很好的概述:
N4174 - 调用语法: x.f(y) vs. f(x,y)这个很像N4165 - 统一调用语法.简单的描述:
这份文档广泛的讨论了在C++中预设的比较该是什么样子,以及它能够将比较运算符设置为默认值有什么意义。本文和N4126有很大关联,同时也与N4239相对应。 N4176 - 对比较的思考 Bjarne总结了下关于预设比较的讨论: 这是一份摘录了系统预设比较草稿的部分讨论的摘要。它提出了许多提议并且根据一系列标准做了比较。我将会对关于比较标准的选择有关的评论尤其感兴趣(故意的双关语)。 |