Salut,
Pour répondre à la première question, oui, c'est légal dans le sens où c'est l'utilisation pour laquelle est prévue reinterpret_cast.
Il faut cependant bien comprendre ce que fait reinterpret_cast pour être sur de ne pas risquer de "tout faire pêter" :
En effet, cela a un comportement tout à fait similaire au cast "C style" brutal et barbare, dans le sens où cela indique au compilateur quelque chose comme
Je sais que tu connais telle donnée comme étant de tel type, mais je te demande de me faire confiance et de la considérer comme s'il s'agissait de tel autre type
Le compilateur va donc te faire une confiance aveugle et considérer la variable comme étant du type que tu lui a indiqué, sans se poser la moindre question
Comme tu l'as toi même si bien fait remarquer, cela revient à armer une bombe à retardement car, si tu te trompes de type, il est très difficile de prévoir le résultat que tu obtiendras
De plus, il faut se méfier avec la classe std::vector dans le sens où elle maintient le nombre d'éléments qu'elle contient ainsi que le nombre d'éléments au delà duquel elle devra agrandir la taille du tableau.
Le réinterpret_cast ne va en aucun cas forcer la classe vector à recalculer ces valeurs pour les adapter à la nouvelle taille des éléments.
Tu risques donc de tenter d'accéder à des éléments "hors limites" si tu transtype ton vector d'un type en un vector d'un type de taille supérieure (par exemple, un std::vector<int> en std::vector<double>).
Par chance, la taille d'un pointeur est clairement définie pour un compilateur donné sur une architecture donnée, et tu retardes donc ce risque si tu travailles sur un std::vector qui manipule des pointeurs au moment où tu essayeras d'accéder à l'élément pointé par le pointeur (car sizeof(int) est différent de sizeof(double)), dans le sens où le tableau sous jascent de std::vector gardera la même taille qu'il s'agisse de pointeurs sur void, sur int ou sur double.
Bref, tu l'auras compris: la méthode est légale, mais très moche et à éviter autant que faire se peut
De prime abord, je te conseillerais de limiter l'utilisation de cette technique aux cas où tu n'as vraiment pas le choix: lorsqu'il s'agit, par exemple, de t'interfacer avec une fonction C qui prend un pointeur de pointeurs sur void ou cas similaires
Tu utiliserais alors sans doute quelque chose comme
laFonctionC(reinterpret_cast<void**>(&myVector[0]);
Dans tous les autres cas, tu as franchement largement intérêt à utiliser ton vector comme ce qu'il est: une collection d'objet d'un type clairement défini
Partager