This earlier question询问this[0]
在C#中的含义。在C ++中,this[0]
表示“this
指向的数组的第0个元素。”
是否保证不会在C ++中导致未定义的行为以这种方式引用接收器对象?我并不主张使用这种语法,并且我很好奇规范是否保证这将始终有效。
谢谢!
答案 0 :(得分:19)
对于任何有效的对象指针p
,p[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;
}