在C ++上执行指针运算有什么合法和/或有趣的用法"这个"指针,如果有的话?
为了让SE对这个问题的长度感到满意,我将提供一些相关的代码。
class Foo
{
public:
Foo(bool terminate = false)
: _data(terminate ? -1 : 0)
{}
void Bar(void)
{
if (_data >= 0)
{
_data++;
this[1].Bar();
}
}
private:
int _data;
};
void main()
{
std::vector<Foo> vec;
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo(true));
vec[2].Bar();
}
答案 0 :(得分:5)
简答:不要。
当然,你可以做各种各样的黑魔法,例如:访问像你所示的前一个或下一个数组元素,通过指针偏移访问基类的私有成员,或者从内存位置获取对象的“唯一”ID,只要它永远不会被移动。但所有这一切很可能在某个时候适得其反,而且我能想到的一切都有一个更安全的解决方案。
我能想到的一个合法用途是对齐检查。假设您有一个需要16字节对齐的float4
类,您可以在构造函数中放置一个断言,以保证(((uintptr_t)(const void *)(this)) % 16 == 0)
。
答案 1 :(得分:0)
这是合法的,但正如评论告诉你的那样,这种风格很糟糕。
除非您是编写一致性测试的工具链开发人员,否则不应该这样做。