15

这个较早的问题询问this[0]C# 中的含义。在 C++ 中,表示“由.this[0]指向的数组的第 0 个元素”。this

是否保证不会导致 C++ 中的未定义行为以这种方式引用接收者对象?我不提倡使用这种语法,我很好奇规范是否保证这将永远有效。

谢谢!

4

6 回答 6

19

对于任何有效的对象指针pp[0]都等价于*p. 所以this[0]等价于*this。没有什么了。就像您可以使用 取消引用任何有效指针一样[0],您也可以使用它取消引用this

换句话说,它只是一种“棘手”的编写方式*this。它可以用来混淆代码。它可能也可以在某些特定情况下用于有用的目的,因为任何独立对象都可以被认为是大小为 1 的数组。(来自 C++03,加法运算符:“对于这些运算符,指针指向非数组对象的行为与指向长度为 1 的数组的第一个元素的指针相同,该数组的类型作为其元素类型。")

PS 正如 Johannes 在评论中指出的那样,通过使用 C++11 功能,可以提出一个上下文,其中this是指向不完整类型的指针。在这种情况下,this[0]表达式变得无效,而*this表达式仍然有效。

于 2013-05-20T17:54:55.503 回答
11

this[0]与 相同*(this + 0),所以这确实很好(尽管有点奇怪)。

于 2013-05-20T17:54:47.657 回答
3

是的,这和它是一样的*this

于 2013-05-20T17:55:10.870 回答
1

AFAIK 基本上this[0]与 完全相同*thisthis只是普通指针。所以是的,它可以安全使用。

array[1]将与*(array + 1)(何时array有效)fyi 相同...

于 2013-05-20T17:55:51.180 回答
0

它(根据定义)等效于*(this + 0),与 相同*this。它是安全且定义明确的,但很奇怪。

于 2013-05-20T17:55:06.230 回答
-2

this[0]一样,*(this + sizeof(this)*0)所以很安全

添加了小测试作为评论的答案

struct A
{
    void * _a;
    int _b;

    A * getThis(int index)
    {
        return &(this[index]);
    }
};

int main(int argc, char * argv[])
{
    A mas[100];

    std::cout << ((long long) mas[0].getThis(50) == (long long) &(mas[50])) << std::endl;
    return 0;
}
于 2013-05-20T17:56:06.660 回答