这个较早的问题询问this[0]
C# 中的含义。在 C++ 中,表示“由.this[0]
指向的数组的第 0 个元素”。this
是否保证不会导致 C++ 中的未定义行为以这种方式引用接收者对象?我不提倡使用这种语法,我很好奇规范是否保证这将永远有效。
谢谢!
这个较早的问题询问this[0]
C# 中的含义。在 C++ 中,表示“由.this[0]
指向的数组的第 0 个元素”。this
是否保证不会导致 C++ 中的未定义行为以这种方式引用接收者对象?我不提倡使用这种语法,我很好奇规范是否保证这将永远有效。
谢谢!
对于任何有效的对象指针p
,p[0]
都等价于*p
. 所以this[0]
等价于*this
。没有什么了。就像您可以使用 取消引用任何有效指针一样[0]
,您也可以使用它取消引用this
。
换句话说,它只是一种“棘手”的编写方式*this
。它可以用来混淆代码。它可能也可以在某些特定情况下用于有用的目的,因为任何独立对象都可以被认为是大小为 1 的数组。(来自 C++03,加法运算符:“对于这些运算符,指针指向非数组对象的行为与指向长度为 1 的数组的第一个元素的指针相同,该数组的类型作为其元素类型。")
PS 正如 Johannes 在评论中指出的那样,通过使用 C++11 功能,可以提出一个上下文,其中this
是指向不完整类型的指针。在这种情况下,this[0]
表达式变得无效,而*this
表达式仍然有效。
this[0]
与 相同*(this + 0)
,所以这确实很好(尽管有点奇怪)。
是的,这和它是一样的*this
AFAIK 基本上this[0]
与 完全相同*this
,this
只是普通指针。所以是的,它可以安全使用。
array[1]
将与*(array + 1)
(何时array
有效)fyi 相同...
它(根据定义)等效于*(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;
}