2013-05-20 30 views
15

This earlier question问什么this[0]在C#中的含义。在C++中,this[0]表示“this指向的数组的第零个元素”。这是[0]在C++中安全吗?

是否保证不会导致C++中的未定义行为以这种方式引用接收者对象?我并不是主张使用这种语法,并且大部分人都很好奇这个规范是否能够保证这一点始终有效。

谢谢!

+1

我非常肯定它的定义很明确,沿着'&obj + 1'的方向走。 – chris

+3

我有时用gdb使用它:假设你做了'p complex-expression-that-yield-pointer',但你想看到对象的内容,而不是指针,所以按下键入'[0] '完成了。无需滚动到表达式的开头并添加括号(可能)。 – rodrigo

回答

19

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

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

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

+5

我很确定你知道它,但答案表明它有所不同。以下是不合格的,用'* this'替换'this [0]'使得它格式良好。 'struct A {auto f() - > decltype(this [0]); };'。 –

+2

对,约翰内斯说,'p [0]'不起作用,当'p'是一个指向不完整类型的指针时。为了补充说明,类型可能是不完整的,因为它尚未完成,如约翰内斯的例子,但也可能是因为类型不能完成(例如'T(*)[]')。它(当然)也不适用于非对象指针类型。 – hvd

11

this[0]*(this + 0)相同,所以确实没问题(虽然有点奇怪)。

+2

对于迂腐,但ISO规范保证呢?我很清楚这个身份,但是这个规范经常会区分对象和数组。 – templatetypedef

+0

@templatetypedef,尽管'obj'是一个数组还是一个对象,'&obj + 1'仍然有效。我会假设这里同样适用。 – chris

+3

@templatetypedef:实际上,'[]'不能在数组上操作,只能在指针上操作。数组衰减为一个指针,'[]'与指针和索引一起工作。所以,是的,这是有保证的。 – rodrigo

0

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

3

是的,这是同样的事情*this

1

据我所知基本上this[0]是完全一样*this,因为this只是一个普通的指针。 所以是的,它是安全的使用。

array[1]是一样的*(array + 1)(当array有效)FYI ...

-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; 
} 
+7

虽然你的答案*技术*正确。 'sizeof(this)'是多余的,意味着'this [1]'与'*(this + sizeof(this)* 1)'相同。或者说这个[N]'通常等同于*(this + sizeof(this)* N)'。这当然是错误的。 –

+0

@BenjaminLindley看到一个小测试,我认为,证明了我的观点 –

+3

我不知道你想用你的测试证明什么观点。你了解我的意见吗?我的观点是'this [N]'* *不等于'*(this + sizeof(this)* N)',但在我看来,您的原始答案意味着它们是等价的。 'sizeof(this)'是完全没有意义的,只会发生,因为它被乘以0.但除了0之外,对于任何其他的N值,它都不起作用。那么为什么你的公式? –