Dam*_*mon 5 c++ gcc this-pointer restrict-qualifier
注意:为澄清起见,问题不是restrict一般地使用关键字,而是具体地将关键字应用于此处所述的成员函数。
gcc允许您在成员函数上使用__restrict__(相当于C99的GNU ++ restrict)限定符,从而有效地this在函数范围内创建了限定限定的指针。牛肉在哪里?
大多数成员函数上的其他成员的工作,通过访问它们this,这是一个T* const(并且通常非混淆)。为了this可能被别名,在成员函数内将需要使用第二个指向类型的指针,并且它必须来自某个地方。
这是非成员函数经常发生的情况,例如所有二进制运算符或采用至少两个相同或非平凡类型的指针或引用的其他自由函数。但是,这些函数没有this,因此它们不相关。
赋值运算符,拷贝构造,和一元比较运算符,其中的成员函数的实例this 可以 在原则上被混叠(因为另一个目的通过引用传递)。因此,给它们分配一个限制限定符才是真正有意义的-编译器应该已经清楚所有其他函数仍然具有限制属性(因为永远不会有第二个指向T的指针)。
现在,例如,如果你用restrict的operator=你应该必然不检查所有自赋值,因为你说this是不是该函数的范围内的别名(以及如果这是真的,没有自我的分配也可能会发生)。
显然,这是您可能无法事先知道的,也是没有意义的。
那么,在一种情况下,人们实际上想给成员函数一个限制限定符,并且有意义吗?
要么我错过了一些东西,要么你的问题没有意义。 与成员函数的任何其他参数this没有什么restrict不同,那么为什么您对 GCC 允许您应用它感到惊讶呢?
关于将其应用于赋值运算符,您正确地指出它将消除显式自赋值测试的需要。然后你说:
显然,这是你不可能提前知道的事情
但当你用于任何事物时,这始终是正确的。restrict例如,某人可能决定memcpy使用重叠的内存区域进行调用;你“不可能提前知道”他们不会这样做。但是,如果这样做的restrict话,对 的参数的声明memcpy就意味着他们犯了一个错误。以完全相同的方式,如果您声明一个赋值运算符restrict,那么某人自赋值该类的对象就会出错。这一点儿也不神秘,也不矛盾。它只是语义的一部分restrict,它对代码的其余部分施加了某些约束。
我也不确定为什么您发现成员函数不可能获取指向同一类型的另一个对象的指针(或引用)。简单的例子:
class Point {
public:
double distance(const Point &other) const;
};
Run Code Online (Sandbox Code Playgroud)
这种事情时常发生。
所以真正的问题是,为什么你的观点this与其他观点如此不同?或者如果你愿意的话,我怎么完全没有理解你的观点呢?
| 归档时间: |
|
| 查看次数: |
2393 次 |
| 最近记录: |