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

tem*_*def 15 c++ arrays pointers this-pointer language-lawyer

这个早期的问题询问this[0]C#中的含义.在C++中,this[0]意思是"指向的数组的第0个元素this".

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

谢谢!

AnT*_*AnT 19

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

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

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

  • 我很确定你知道它,但答案表明它有所不同.以下是错误的,用`*this`替换`this [0]`使它变得良好.`struct A {auto f() - > decltype(this [0]); };`. (5认同)
  • 是的,Johannes说,当p`是指向不完整类型的指针时,`p [0]`不起作用.要添加到那个,类型可能是不完整的,因为它尚未完成,如约翰内斯的例子,但也可能是因为类型无法完成(例如`T(*)[]`).它(当然)也不适用于非对象指针类型. (2认同)

Ker*_* SB 11

this[0]是一样的*(this + 0),所以确实这很好(尽管有点奇怪).

  • @templatetypedef:来自C++ 03,Additive运算符:"出于这些运算符的目的,指向非对象对象的指针的行为与指向长度为1的数组的第一个元素的指针的行为相同,对象的类型为元素类型." (5认同)
  • @templatetypedef:实际上,`[]`不能在数组上运行,只能在指针上运行.数组衰减成指针,`[]`与指针和索引一起工作.所以,是的,它是有保证的. (3认同)
  • 抱歉迂腐,但ISO规格是否保证这一点?我很清楚这种身份,但规范经常区分对象和数组. (2认同)