C ++ 11是否添加C99限制说明符?如果没有,为什么不呢?

问题描述

| “ 0”是C99的一项功能,最近通过允许编译器对指针执行“仅fortran-only”优化,引起了广泛关注。它也是Microsoft最近宣布的相同关键字,它是C ++ AMP规范的基础。 该关键字实际上在FCD中吗?如果不是,是否有特定的原因被忽略?     

解决方法

        一个论点是,C比C ++需要多“ 0”,因为许多操作都是通过指向原始类型的指针完成的,因此C代码比C ++具有更多的别名问题。 别名规则说,指向不同类型的指针不能别名,因此,如果指向函数的参数具有不同的类类型,则它们不能重叠。 在C ++中,我们还拥有
valarray
类家族,该类家族可以处理不允许别名的原始类型的数组。并不是说它经常使用... 添加另一种解决某些混叠问题的方法,显然并没有使委员会感到兴奋。     ,        §17.2[library.c]中仅提及C ++ 11 FDIS中的“ 0”:   许多库函数的描述都依赖于C标准库的签名和语义   这些功能。在所有此类情况下,均应省略对“ 0”限定词的任何使用。 因此
restrict
在C ++ 11中不存在。     ,        http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/   不仅VC ++团队,而且ISO C ++标准委员会都考虑分别对VC ++和ISO C ++增加限制。尽管它是为ISO C ++ 11专门建议的,但被拒绝了,部分原因是它并不总是很清楚如何扩展到C ++代码,因为C ++是一门具有更多选项的更大的语言,我们希望确保该功能在所有语言中都能正常工作。整个语言。     ,        不要以为它在C ++ 1x中(不幸的是,时间长了0x ...!),但是至少msvc和g ++通过
__restrict
__restrict__
扩展支持它。 (我不太使用gcc,我认为这是正确的扩展名)。 为了正确使用C ++,我觉得我们还需要受限制的引用,而不仅仅是指针,可能是按照我的问题C ++别名规则的思路。不知道其中的某些考虑是否会阻止事情发展……     ,        我会问:“为什么不呢?”
restrict
基本上只是编译器无法验证的断言。 (或者更确切地说,当编译器可以验证它时,断言本身是没有帮助的。)这并不是C ++委员会想要的。 C ++一直倾向于假定“足够智能的编译器”;哎呀,看看编译器赶上来之前最琐碎的C ++库的可怕性能。 我还怀疑委员会认为,在所有其他C ++功能(引用,右值引用,等等等等)存在的情况下准确定义ѭ0语义是不平凡的。 因此,轻而易举地指定+ \“一个足够聪明的编译器不需要它” = NAK。