Initialisation d'un vector

Initialisation d'un vector - C++ - Programmation

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 :
 

Code :
  1. #include <vector>
  2. int main()
  3. {
  4.     std::vector<int*> v(10, NULL);
  5.     return 0;
  6. }


 
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 ?

Reply

Marsh Posté le 27-10-2004 à 16:41:33   

Reply

Marsh Posté le 27-10-2004 à 16:47:38    

Oui.

Code :
  1. #include <vector>
  2. int main()
  3. {
  4.      int * empty = 0;
  5.      std::vector<int*> v(10, empty);
  6.      return 0;
  7. }


Le constructeur a besoin d'une référence en 2ème paramètre.
 
edit: ou bien simplement:

Code :
  1. std::vector<int*> v(10, (int *)0);


 
Je me souvenais plus que la construction de références vers des objets temporaires s'était améliorée dans g++...


Message édité par Lam's le 27-10-2004 à 16:54:12
Reply

Marsh Posté le 27-10-2004 à 16:56:28    

avec un static_cast c'est encore plus joli :p

Reply

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

Reply

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.

Reply

Marsh Posté le 27-10-2004 à 17:08:00    

en règle général, n'utilise JAMAIS les cast C (T*) en C++

Reply

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 ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

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.

Reply

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).

Reply

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 :
  1. int * a = static_cast<int*>( 0 ); // ok
  2.     int * c = reinterpret_cast<int*>( 1 ); // ok
  3.     int * b = static_cast<int*>( 1 ); // dtc !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-10-2004 à 17:28:02   

Reply

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 :
  1. struct World { int x; };
  2. void Hello(const World & t) {
  3.   std::cout << t.x << std::endl;
  4. }
  5. int main() {
  6.   Hello(World(4));
  7. }


Message édité par Lam's le 27-10-2004 à 17:33:10
Reply

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.

Reply

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.

Reply

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.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

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.

Reply

Marsh Posté le 27-10-2004 à 20:52:42    

Ok thx a vous deux.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed