Какой тип броска из Типа * в void *? - PullRequest
5 голосов
/ 04 февраля 2010

В C ++ для любого типа данных я могу сделать следующее:

Type* typedPointer = obtain();
void* voidPointer = typedPointer;

, какое приведение выполняется, когда я присваиваю Type* void*?Это то же самое, что и

Type* typedPointer = obtain();
void* voidPointer = reinterpret_cast<void*>( typedPointer );

или это какой-то другой актерский состав?

Ответы [ 4 ]

4 голосов
/ 05 февраля 2010

Это стандартное преобразование указателя.Поскольку это стандартное преобразование, оно не требует явного приведения.

Если вы хотите воспроизвести поведение этого преобразования при явном приведении, это будет static_cast, а не reinterpret_cast.

Если определение static_cast дано в 5.2.9 / 2, static_cast может выполнять все преобразования, которые могут быть выполнены неявно.

4 голосов
/ 04 февраля 2010

От Type* до void* доступно неявное преобразование. Вы можете использовать static_cast, чтобы уточнить смысл кода. Для обратного вам требуется reinterpret_cast

РЕДАКТИРОВАТЬ : Согласно комментарию для обратного можно также использовать static_cast Пробовал кусок кода, и он действительно компилируется. Не знал об этом и всегда использовал reinterpret_cast для сотворения из пустоты *.

4 голосов
/ 04 февраля 2010

Это не приведение, это неявное преобразование.Приведения являются явными по определению.Это не более бросок чем:

char c = 'a';
int i = c;

is.

2 голосов
/ 04 февраля 2010

Это тот же состав. Любой указатель может быть приведен к пустому указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...