Это прежний вопрос спрашивает что this[0]
значит в C #. В C ++ this[0]
означает «нулевой элемент массива, на который указывает this
«.
Гарантируется ли, что неопределенное поведение в C ++ будет ссылаться на объект-получатель таким образом? Я не сторонник использования этого синтаксиса, и мне больше всего интересно, гарантирует ли спецификация, что это всегда будет работать.
Спасибо!
Для любого действительного указателя объекта p
, p[0]
эквивалентно *p
, Так this[0]
эквивалентно *this
, Там больше ничего нет. Так же, как вы можете разыменовать любой действительный указатель, используя [0]
разыграешь this
с этим.
Другими словами, это просто «хитрый» способ написания *this
, Это может быть использовано для запутывания кода. Вероятно, он может использоваться в некоторых конкретных обстоятельствах и для полезных целей, поскольку любой автономный объект можно рассматривать как массив размера 1. (Из C ++ 03, Аддитивные операторы: «Для целей этих операторов указатель к объекту, не являющемуся массивом, ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве типа его элемента. «)
Постскриптум Как отметил Йоханнес в комментариях, используя возможности C ++ 11, можно создать контекст, в котором this
указатель на неполный тип В таком случае this[0]
выражение становится недействительным, в то время как *this
Выражение остается в силе.
this[0]
такой же как *(this + 0)
так что это действительно хорошо (хотя и немного странно).
Да, это то же самое, что *this
AFAIK в основном 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;
}