массивы — это [0] безопасно в C ++?

Это прежний вопрос спрашивает что this[0] значит в C #. В C ++ this[0] означает «нулевой элемент массива, на который указывает this«.

Гарантируется ли, что неопределенное поведение в C ++ будет ссылаться на объект-получатель таким образом? Я не сторонник использования этого синтаксиса, и мне больше всего интересно, гарантирует ли спецификация, что это всегда будет работать.

Спасибо!

15

Решение

Для любого действительного указателя объекта p, p[0] эквивалентно *p, Так this[0] эквивалентно *this, Там больше ничего нет. Так же, как вы можете разыменовать любой действительный указатель, используя [0]разыграешь this с этим.

Другими словами, это просто «хитрый» способ написания *this, Это может быть использовано для запутывания кода. Вероятно, он может использоваться в некоторых конкретных обстоятельствах и для полезных целей, поскольку любой автономный объект можно рассматривать как массив размера 1. (Из C ++ 03, Аддитивные операторы: «Для целей этих операторов указатель к объекту, не являющемуся массивом, ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве типа его элемента. «)

Постскриптум Как отметил Йоханнес в комментариях, используя возможности C ++ 11, можно создать контекст, в котором this указатель на неполный тип В таком случае this[0] выражение становится недействительным, в то время как *this Выражение остается в силе.

19

Другие решения

this[0] такой же как *(this + 0)так что это действительно хорошо (хотя и немного странно).

11

Да, это то же самое, что *this

3

AFAIK в основном this[0] точно так же, как *this, как this это просто нормальный указатель.
Так что да, это безопасно для использования.

array[1] будет так же, как *(array + 1) (когда array действительно) фу …

1

Это эквивалентно (по определению) *(this + 0), который так же, как *this, Это безопасно и четко определено, но странно.

0

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;
}
-2
По вопросам рекламы [email protected]