这个[0]在C ++中是安全的吗?

时间:2013-05-20 17:53:47

标签: c++ arrays pointers language-lawyer this-pointer

This earlier question询问this[0]在C#中的含义。在C ++中,this[0]表示“this指向的数组的第0个元素。”

是否保证不会在C ++中导致未定义的行为以这种方式引用接收器对象?我并不主张使用这种语法,并且我很好奇规范是否保证这将始终有效。

谢谢!

6 个答案:

答案 0 :(得分:19)

对于任何有效的对象指针pp[0]等同于*p。因此this[0]相当于*this。没有更多的东西。就像您可以使用[0]取消引用任何有效指针一样,您可以使用它取消引用this

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

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

答案 1 :(得分:11)

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

答案 2 :(得分:3)

是的,它与*this

是一回事

答案 3 :(得分:1)

AFAIK this[0]*this完全相同,因为this只是一个普通指针。 所以是的,使用是安全的。

array[1]*(array + 1)相同(当array有效时)fyi ...

答案 4 :(得分:0)

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

答案 5 :(得分:-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;
}