Технически вы определили один объект. aсам по себе является объектом. (Не все объекты имеют определяемые пользователем типы в C ++)
MSalters
1
@MSalters, что это за «объект», о котором вы говорите? : D
Gusdor
3
@Gusdor Мы можем только предполагать, что находится за пределами горизонта событий.
Коул Джонсон,
Они называются по-разному, однако «эффект» в этом случае тот же
Стасик
В целом они не эквивалентны, но в этом сценарии они есть.
Гонки за легкостью на орбите,
7
В void* a, aобъявлен как указатель не к voidтипу , а к «любой» типа (частный случай). Адрес (позиция в памяти) присваивается a, как и любой другой объявленной переменной, конечно.
После этого выражение &aвычисляется для инициализации только что объявленной переменной (также a, но это не имеет значения). Типом &aявляется «указатель на указатель на любой тип», который является частным случаем «указателя на любой тип», полностью совместимого с типом a. Ergo, нет сообщения компилятора.
Следствие: не используйте, void*если хотите строгую проверку типов. В него можно преобразовать все что угодно . Как раз наоборот, в обратном направлении, кроме void*самого себя (было бы ненужным исключением, если бы тип был несовместим сам с собой).
Ответы:
Объем объявления переменных в C ++ может быть довольно удивительным:
void* a = &a; ^~~~~~~~~~~~~~~~~ a declared as `void*` from here on
Таким образом,
&a
есть ,void**
но так как любой тип указателя неявно конвертируется вvoid*
...источник
a = &userfulObject
?void *a = a;
это будет UB, если объявлено локально, в противном случае это нормально в области пространства имен.Это эквивалентно
void* a; a = &a;
Таким образом,
a
было объявлено. Такa
получает адресa
записанный вa
. Так что это указатель на указатель void. (Вы еще не определили никаких объектов.)источник
a
сам по себе является объектом. (Не все объекты имеют определяемые пользователем типы в C ++)В
void* a
,a
объявлен как указатель не кvoid
типу , а к «любой» типа (частный случай). Адрес (позиция в памяти) присваиваетсяa
, как и любой другой объявленной переменной, конечно.После этого выражение
&a
вычисляется для инициализации только что объявленной переменной (такжеa
, но это не имеет значения). Типом&a
является «указатель на указатель на любой тип», который является частным случаем «указателя на любой тип», полностью совместимого с типомa
. Ergo, нет сообщения компилятора.Следствие: не используйте,
void*
если хотите строгую проверку типов. В него можно преобразовать все что угодно . Как раз наоборот, в обратном направлении, кромеvoid*
самого себя (было бы ненужным исключением, если бы тип был несовместим сам с собой).Кроме того, AFAIR это действительно исходит от C.
источник