注意:澄清一下,问题不是一般意义上的 restrict
关键字的使用,而是具体关于将其应用于成员函数的问题,如 here 所述。 .
gcc 允许您在成员函数上使用 __restrict__
(GNU++ 相当于 C99 的 restrict
)限定符,有效地使 this
成为 restrict函数范围内的限定指针。牛肉在哪里?
大多数成员函数作用于其他成员,通过 this
访问它们,它是一个 T* const
(通常没有别名)。要使 this
可能具有别名,则需要在成员函数中以某种方式使用第二个指向类型的指针,并且它必须来自某个地方。
这是非成员函数经常出现的情况,例如所有二元运算符或任何其他至少采用相同的、非平凡类型的指针或引用的任何其他自由函数。但是,这些函数没有 this
,因此它们不相关。
赋值运算符、复制构造函数和一元比较运算符是成员函数的示例,其中 this
原则上可以 别名(因为另一个对象是通过引用传递的)。因此,为这些函数分配一个 restrict 限定符才真正有意义——对于编译器来说,所有其他函数无论如何都具有 restrict 属性应该已经很明显了(因为从来没有第二个指向 T 的指针)。
现在,例如,如果您在 operator=
上使用了 restrict
,您应该因此根本不检查自赋值,因为您再说 this
在该函数的范围内没有别名(如果这是真的,则不可能发生自赋值)。
显然,这是你不可能事先知道的事情,也是没有意义的事情。
那么,在什么情况下人们真的想给成员函数一个 restrict 限定符并且它在什么情况下有意义?
最佳答案
要么是我遗漏了什么,要么是你的问题没有意义。 this
与成员函数的任何其他参数没有that 不同,那么为什么您对 GCC 允许您对其应用 restrict
感到惊讶?
关于将其应用于赋值运算符,您正确地指出它将避免显式自赋值测试的需要。然后你说:
Obviously, this is something that you cannot possibly know in advance
但是当您对任何内容使用 restrict
时,这总是是真的。例如,有人可能决定调用具有重叠内存区域的 memcpy
;你“不可能事先知道”他们不会这样做。但是 memcpy
的参数的 restrict
声明意味着 如果他们这样做,他们就犯了错误。以完全相同的方式,如果您声明一个赋值运算符 restrict
,那么您就已经使某人对该类的对象进行 self 赋值成为错误。这根本没有什么神秘或矛盾的地方;它只是 restrict
语义的一部分,它对您的代码的其余部分施加了某些约束。
我也不确定为什么您会发现成员函数不可能将指针(或引用)指向另一个相同类型的对象。简单的例子:
class Point {
public:
double distance(const Point &other) const;
};
这种事时有发生。
所以真正的问题是,为什么您认为 this
与任何其他论点如此不同?或者,如果您愿意,我怎么会完全忽略您的观点?
关于c++ - 限制成员函数的限定符(限制此指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808472/