Initialisation d'un vector - C++ - Programmation
Marsh Posté le 27-10-2004 à 16:47:38
Oui.
Code :
|
Le constructeur a besoin d'une référence en 2ème paramètre.
edit: ou bien simplement:
Code :
|
Je me souvenais plus que la construction de références vers des objets temporaires s'était améliorée dans g++...
Marsh Posté le 27-10-2004 à 17:01:11
je vois pas le machin avec les références. c'est juste qu'il y a une ambiguité
std::vector<int*> v(10, static_cast<int*>(0))
et tout roule
Marsh Posté le 27-10-2004 à 17:05:09
Merci beaucoup.
Je ne connaissais pas les static_cast<>, je vais chercher de la doc là-dessus.
Marsh Posté le 27-10-2004 à 17:08:00
en règle général, n'utilise JAMAIS les cast C (T*) en C++
Marsh Posté le 27-10-2004 à 17:17:42
Comment cela se fesse que static_cast passe pour (et que pour d'ailleurs) un pointeur nul ? C'est pas du domaine de reinterpret_cast plutôt ?
Marsh Posté le 27-10-2004 à 17:23:30
non.
0 c'est le pointeur nul... selon le contexte. Si tu file 0 comme ça, le template il perd un peu les pédales. Donc on explicite le contexte.
Marsh Posté le 27-10-2004 à 17:25:34
HelloWorld a écrit : C'est pas du domaine de reinterpret_cast plutôt ? |
Nope.
Un reinterpret_cast ça serait plutôt passer de float* à int*. Mais convertir le pointeur 0 en int *, ça passe, vu qu'il n'a pas de type.
Pis j'ai pas mis de static_cast parce que j'avais la flemme, et que dans ce genre de cas là, j'en met rarement (pour convertir des valeurs, passer des trucs aux APIs C, etc. c'est juste un moyen mnémotechnique pour repérer facilement dans mon code ce qui est propre et ce qui est de la bidouille).
Marsh Posté le 27-10-2004 à 17:28:02
Oui ca je sais. Ce que je pige pas c'est pourquoi on explicite avec static_cast dans le cas de 0, et reinterpret_cast sinon. Ma question se résume à pourquoi ça :
Code :
|
Marsh Posté le 27-10-2004 à 17:31:28
Taz a écrit : je vois pas le machin avec les références. c'est juste qu'il y a une ambiguité |
T'es trop jeune, c'est pour ça.
Dans les vieilles versions (3.0 ou 2.9X, je sais plus), g++ ne savait pas construire de références constantes vers des objets temporaires.
Donc ça, ça merdait un peu:
Code :
|
Marsh Posté le 27-10-2004 à 17:32:33
HelloWorld a écrit : Oui ca je sais. |
Pardon. C'est parce que 0 est une valeur spéciale, qui correspond au pointeur Null (ou Nil en Pascal, ou NULL en C). Alors que 1, c'est l'adresse 1.
Marsh Posté le 27-10-2004 à 17:57:47
peut être mais là ça n'est pas le problème. Cette ambiguité n'a rien à voir avec une implémentation particulière. et de ce que tu racontes, je n'ai jamais vu ce problème avec ces versions de gcc. Ce que tu dis n'a pas de sens.
Marsh Posté le 27-10-2004 à 19:43:03
Lam's a écrit : Pardon. C'est parce que 0 est une valeur spéciale, qui correspond au pointeur Null (ou Nil en Pascal, ou NULL en C). Alors que 1, c'est l'adresse 1. |
NULL en C, Nil en Pascal, mais Nul en français
Donc c'est une exception de la norme.
J'avais suivi un débat sur le C sur "NULL vaut-il toujours 0 ?". C'était complexe, je crois me souvenir que le pointeur NULL peut valoir autre chose que zéro, mais le compilo doit faire en sorte que c'est comme si c'était 0.
Marsh Posté le 27-10-2004 à 19:45:51
NULL c'est 0. En C et C++. En C on rajoute un ((void*)0) pour quoi le compilo ferme un peu sa gueule. En C et C++, 0 représente le pointeur nul. ce qui ne signifie pas que la représentation binaire du pointeur nul doit être 0.
Marsh Posté le 27-10-2004 à 20:52:42
Reply
Marsh Posté le 27-10-2004 à 16:41:33
Bonjour,
Je cherche à comprendre pourquoi est-ce que mon compilateur (GCC sous Windows en utilisant MinGW) m'insulte lorsque je fais ceci :
Alors que si j'utilise un vector<int> ça passe (valable pour tout autre objet).
Bref, est-il possible de créer un vecteur de pointeurs nuls ?