1

如果有的话,对 C++ 的“this”指针执行指针算术有哪些合法和/或有趣的用途?

为了让 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();
}
4

2 回答 2

5

简短的回答:不要。

当然,你可以用这个做各种黑魔法,例如访问前面或后面的数组元素,通过指针偏移量访问基类的私有成员,或者从它的对象中获取对象的“唯一”ID内存位置,只要它从未移动过。但所有这一切很可能在某个时候适得其反,而且对于我能想到的一切,都有一个更安全的解决方案。

我能想到的一种合法用途是对齐检查。假设您有一个float4需要 16 字节对齐的类,您可以在构造函数中放置一个断言来保证(((uintptr_t)(const void *)(this)) % 16 == 0).

于 2015-01-07T15:38:08.930 回答
0

这是合法的,但正如评论告诉你的那样,这是一种糟糕的风格。

除非您是编写一致性测试的工具链开发人员,否则您不应该这样做。

于 2015-01-07T15:46:30.540 回答