Utilisez static_cast
il s'agit de la distribution la plus étroite qui décrit exactement ce que la conversion est faite ici.
Il y a une idée fausse selon laquelle utiliser reinterpret_cast
correspondrait mieux, car il signifie "ignorer complètement la sécurité des types et lancer simplement de A à B".
Cependant, cela ne décrit pas réellement l'effet d'une reinterpret_cast
. Plutôt, reinterpret_cast
a un certain nombre de significations, pour lesquelles on considère que "la mise en correspondance effectuée par reinterpret_cast
est définie par la mise en œuvre." [5.2.10.3]
Mais dans le cas particulier de la coulée de void*
a T*
le mappage est complètement bien défini par la norme ; à savoir, attribuer un type à un pointeur sans type sans changer son adresse.
C'est une raison de préférer static_cast
.
En outre, et c'est sans doute le plus important, chaque utilisation de l'outil reinterpret_cast
est carrément dangereux car il convertit n'importe quoi en n'importe quoi d'autre (pour les pointeurs), alors que static_cast
est beaucoup plus restrictive, offrant ainsi un meilleur niveau de protection. Cela m'a déjà sauvé de bogues où j'ai accidentellement essayé de forcer un type de pointeur dans un autre.
79 votes
@anon Apparemment, vous n'avez jamais travaillé avec des threads POSIX.
8 votes
@user470379 Wow... c'est la raison même pour laquelle j'ai atterri sur cette question à SO ! Excellente observation :-).