这个早期的问题询问C#中的this[0]
是什么意思。在C++中,this[0]
表示“指向this
所指向的数组的第零个元素”。
在C++中,以这种方式引用接收对象是否保证不会导致未定义的行为?我并不主张使用这种语法,主要是想知道规范是否保证这将始终起作用。
谢谢!
这个早期的问题询问C#中的this[0]
是什么意思。在C++中,this[0]
表示“指向this
所指向的数组的第零个元素”。
在C++中,以这种方式引用接收对象是否保证不会导致未定义的行为?我并不主张使用这种语法,主要是想知道规范是否保证这将始终起作用。
谢谢!
p
,p[0]
等价于*p
。所以this[0]
等同于*this
。就像您可以使用[0]
解引用任何有效的指针一样,您也可以使用它解引用this
。*this
的“棘手”方式。它可以用于混淆代码。在某些特定情况下,它可能也可以用于有用的目的,因为任何独立的对象都可以被视为具有长度为1且元素类型为该对象类型的数组。(来自C++03,加性运算符:“对于这些运算符,指向非数组对象的指针与类型为其元素类型的一个长度为1的数组的第一个元素的指针行为相同。”)this
是指向不完整类型的指针。在这种情况下,this[0]
表达式变得无效,而*this
表达式仍然有效。this[0]
替换为*this
可以解决这个问题。struct A { auto f () -> decltype (this [0]); };
。 - Johannes Schaub - litbp
是指向不完整类型的指针时,p[0]
无法使用。此外,类型可能不完整是因为其尚未完成,就像Johannes的例子一样,但也可能是因为无法完成该类型(例如T(*)[]
)。当然,对于非对象指针类型也无法工作。 - user743382this [0]
与 *(this + 0)
是等价的,因此这样做虽然有点奇怪但是没问题。
obj
是数组还是单个对象,&obj + 1
都是有效的。我认为这里也适用。 - chris[]
操作符不作用于数组本身,而只作用于指针。数组会被转换为指向首元素的指针,[]
操作符会使用该指针和索引值进行操作。因此,是的,这是有保证的。 - rodrigo没错,它就是*this
。
this[0]
和*this
完全相同,因为this
只是一个普通指针。所以,使用它是安全的。
array[1]
与*(array + 1)
相同(当array
有效时),供您参考...按照定义,它等同于 *(this + 0)
,这与 *this
相同。它是安全和明确定义的,但很奇怪。
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;
}
sizeof(this)
是多余的,并暗示着 this[1]
与 *(this + sizeof(this)*1)
相同,或者 this[N]
通常等价于 *(this + sizeof(this)*N)
。当然,这是错误的。 - Benjamin Lindleythis[N]
和*(this + sizeof(this)*N)
是不等价的,但是在我看来,你原来的回答暗示它们是等价的。sizeof(this)
是完全没有意义的,只是碰巧因为它与0相乘而起作用。但是对于除0以外的任何其他值的N
,它都行不通。那么为什么你的公式中会有它呢? - Benjamin Lindleythis [0]
恰好与*(this + sizeof(this)* 0)
相同,但this [N]
不与*(this + sizeof(this)* N)
相同;相反,它等效于*(this + N)
(这是N * sizeof * this
字节的对象,或更简单地说,是在this
指向的位置之后N个元素)。在任何情况下,sizeof(this)
无关紧要;它提供的是指针的大小,而不是指向的对象的大小。 - Keith Thompson
&obj + 1
的路线。 - chris