[C++] taz, help, 3 questions sur la syntaxe

taz, help, 3 questions sur la syntaxe [C++] - C++ - Programmation

Marsh Posté le 07-02-2006 à 19:25:40    

1) Quelles sont les conditions pour déclarer une variable dans un if ?
Une fois sur 2 mon compilo refuse, sans que je sache pkoi, et le stroutrup n'est pas très explicite sur ce point.
Faut-il que la variable soit const, qu'elle soit initialisée par son constructeur de copie ou un truc du genre ?
Ou est-ce juste visual c++ 7 qui merde ?
 
2) Peut-on faire de la composition de fonctor object avec la STL ? Je ne parle pas de boost mais de la STL !
Je n'ai rien trouvé dans la ref, étrange.
 
3)

Code :
  1. int f() { return 42; }
  2. const int& g() { return 42; }
  3. const int& h() { int a = 42; return a; }
  4. int& m() { return 42; }
  5. const int& a = f(); // correct
  6. const int& b = g(); // ??
  7. const int& c = h(); // ??
  8. const int& d = m(); // ??
  9. int        e = m(); // ??


 
la première affectation est correcte, mais si "int" était un type complet (class ou struct), y aurait-il économie d'un appel au constructeur de copie par rapport au cas où a serait un objet et pas une ref ?
Les autres sont-elles correctes ?

Reply

Marsh Posté le 07-02-2006 à 19:25:40   

Reply

Marsh Posté le 07-02-2006 à 19:28:40    

declarer une variable dans un if ? c'est pas un peu de la perversion ca ?
 

Reply

Marsh Posté le 07-02-2006 à 19:35:40    

c'est conseillé dans le stoustrup pour maximiser la "localisation" des variables et l'utilisation de const.
 
if (const int n = t.toto())
   r += n;
 
un truc du genre :D
Mais c'est vrai que c'est tellement peu habituel que ça n'a pas été repris dans le C99 alors que la déclaration dans le for a été ajoutée.

Reply

Marsh Posté le 07-02-2006 à 19:41:13    

mais ca ne veut rien dire ca ? [:le kneu]

Reply

Marsh Posté le 07-02-2006 à 19:41:43    

ou alors ecrit  
 
if (t.toto())
 
enfin j'imagine c'est un exemple, mais jtrouve ca fait tres "je charge mon if comme un mulet" :d

Reply

Marsh Posté le 07-02-2006 à 19:52:09    

chrisbk a écrit :

mais ca ne veut rien dire ca ? [:le kneu]


si, c'est la généralisation de

Code :
  1. for(int i = ...;;) {}

ben là tu as

Code :
  1. if(int i=..) {}

c'est logique [:pingouino]
 
 
 
edit: dans la tête à Stroumachin.


Message édité par nraynaud le 07-02-2006 à 19:52:46
Reply

Marsh Posté le 07-02-2006 à 19:56:59    

jesus_christ a écrit :

1) Quelles sont les conditions pour déclarer une variable dans un if ?
Une fois sur 2 mon compilo refuse, sans que je sache pkoi, et le stroutrup n'est pas très explicite sur ce point.
Faut-il que la variable soit const, qu'elle soit initialisée par son constructeur de copie ou un truc du genre ?
Ou est-ce juste visual c++ 7 qui merde ?


 
C'est légal. Montre un exemple qui ne fonctionne pas stp.
 

Citation :

2) Peut-on faire de la composition de fonctor object avec la STL ? Je ne parle pas de boost mais de la STL !
Je n'ai rien trouvé dans la ref, étrange.


 
?
 

jesus_christ a écrit :


3)

Code :
  1. int f() { return 42; }
  2. const int& g() { return 42; }  // reference const à un temporaire. Légal mais catastrophique.
  3. const int& h() { int a = 42; return a; }// reference const à une variable locale. Légal mais catastrophique.
  4. int& m() { return 42; } // assignation d'un temporaire à une reference non const : illégal
  5. const int& a = f(); // correct
  6. const int& b = g(); // ??
  7. const int& c = h(); // ??
  8. const int& d = m(); // ??
  9. int        e = m(); // ??


 
la première affectation est correcte, mais si "int" était un type complet class (class ou struct, ( + union) ), y aurait-il économie d'un appel au constructeur de copie par rapport au cas où a serait un objet et pas une ref ?


 
<edit>Oui dans un cas simple</edit>. Le compilateur a le droit de construire l'objet "sur" la valeur de retour. C'est le NRVO.


Message édité par ++fab le 07-02-2006 à 20:11:49
Reply

Marsh Posté le 07-02-2006 à 20:06:07    

1) c'est vc7 :)
 
le reste je lis :)

Reply

Marsh Posté le 07-02-2006 à 20:19:37    

2) sur la composition en stl : bah effectivement, y a rien si je me souviens bien.
 
3) t'en as pas marre de nous renvoyer des références à des variables locales ? le mieux c'est de regarder ... bah gcc, il est pas con, il voit bien que tu fais du caca, donc il fait du caca, il te renvoit ta référence comme demandée, seulement comme c'est du local, ben il te renvoit du bidon, il construit rien du tout :)

Reply

Marsh Posté le 07-02-2006 à 20:28:44    

jesus_christ a écrit :

c'est conseillé dans le stoustrup pour maximiser la "localisation" des variables et l'utilisation de const.
if (const int n = t.toto())
   r += n;


on voit plus souvent ça :
int const n = t.toto();
if( n )
    r += n;
Ce qui est clairement moins bon.

jesus_christ a écrit :


Mais c'est vrai que c'est tellement peu habituel que ça n'a pas été repris dans le C99 alors que la déclaration dans le for a été ajoutée.


on sent bien dans tous ces choix moisis depuis 90, que le C est au bout du rouleau (troll inside).

Reply

Marsh Posté le 07-02-2006 à 20:28:44   

Reply

Marsh Posté le 09-02-2006 à 23:31:54    

1) fait chier VC++, merci GCC4
 
2) ils avaient mal dormi au commité C++ ? Je l'ai recodé à la main le composeur ça fait 8 lignes, ils auraient pu standardiser ça, c'est pas méchant :(
 
3) taz : justement renvoyer une ref constante initialisée avec une constante littérale (comme dans g()) ça peut être légal. Sinon oui je sais pour la durée de vie des locales ;) mais en C++ c'est du sucre syntaxique cette ppté sur const T& qui ne marche pas pour T&.

Reply

Marsh Posté le 10-02-2006 à 10:43:42    

2) passe à boost, c'est quand même terriblement mieux.

Reply

Marsh Posté le 10-02-2006 à 18:41:42    

2) t'aurais un bon site sur boost (sinon oui je connais google, c'est pour pas perdre de temps)
 
3) tu connais pas la réponse explicitement, parce que teser sur un compilo, même gcc, c'est pas très strict comme méthode.
 
++fab : c'est vrai que de nombreux ajout du C99 sont étranges, c'est soit du sucre syntaxique bizarre qui rend le code encore + dur à lire, soit des extentions qui cassent beaucoup de conventions comme
int n = rand();
int tab[n]; // taille dynamique
sizeof tab // ce n'est pas une constante !
 
par contre les bons trucs du C++ ont été ajoutés, comme ça avait été le cas en 89 déjà (car le C++ c'est vieux qd même), les commentaires //, for (int i...), déclaration = instruction, bool, complex.
inline et restrict ça peut être utile pour l'optimisation, car le C il ne lui reste plus grand chose d'autre.

Reply

Marsh Posté le 11-02-2006 à 06:26:22    

2) La documentation de boost est plutôt bien faite !
 
J'ai acheté un bouquin que j'ai vu passé sur la mailing list. Le ton est abordable, les exemples sont simples et illustrent chacun des concepts abordés. J'avais un peu de mal avec certains aspects de la documentation web, maintenant ça va bien mieux :)
 
http://images-eu.amazon.com/images/P/0321133544.01.MZZZZZZZ.jpg
 
http://www.amazon.fr/exec/obidos/A [...] 32-2397079

Reply

Marsh Posté le 12-02-2006 à 11:22:03    

chrisbk a écrit :

ou alors ecrit  
 
if (t.toto())
 
enfin j'imagine c'est un exemple, mais jtrouve ca fait tres "je charge mon if comme un mulet" :d


C'est un peu comme ceux qui ecrivent tout leur programme dans une boucle for.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 12-02-2006 à 11:22:47    

bah nan

Reply

Marsh Posté le 12-02-2006 à 11:22:56    

enfin un peu

Reply

Marsh Posté le 12-02-2006 à 11:23:00    

mais pas que

Reply

Marsh Posté le 12-02-2006 à 11:25:11    

Evadream -jbd- a écrit :

2) La documentation de boost est plutôt bien faite !
 
J'ai acheté un bouquin que j'ai vu passé sur la mailing list. Le ton est abordable, les exemples sont simples et illustrent chacun des concepts abordés. J'avais un peu de mal avec certains aspects de la documentation web, maintenant ça va bien mieux :)
 
http://images-eu.amazon.com/images/P/0321133544.01.MZZZZZZZ.jpg
 
http://www.amazon.fr/exec/obidos/A [...] 32-2397079


La couverture [:le kneu]


Message édité par el muchacho le 12-02-2006 à 11:25:38

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-02-2006 à 19:38:27    

jesus_christ a écrit :

1) fait chier VC++, merci GCC4


Pas besoin d'attendre la version 4 pour ça !
 

Citation :

2) ils avaient mal dormi au commité C++ ? Je l'ai recodé à la main le composeur ça fait 8 lignes, ils auraient pu standardiser ça, c'est pas méchant :(

A quoi ça ressemble tout ça ?
 

Citation :


3) taz : justement renvoyer une ref constante initialisée avec une constante littérale (comme dans g()) ça peut être légal.  
Sinon oui je sais pour la durée de vie des locales ;)  


Assigner une littérale constante à une reférence const, c'est légal. Dans g(), c'est plutot une littérale flottante. Vu que c'est une rvalue, tu as le droit de l'assigner à une référence constante. Ce qui se passe, c'est qu'un temporaire est crée au moment de lassignation, et il a -- dans ce cas -- la durée de vie de la scope. 42 est dans la scope de g(), et le temporaire meurt prématurément.
 

Citation :

mais en C++ c'est du sucre syntaxique cette ppté sur const T& qui ne marche pas pour T&.


Si un T& fonctionnait comme un T const&, ça poserait pas mal de problèmes.

Reply

Marsh Posté le 13-02-2006 à 19:51:33    

Citation :

2) ++fab : c'est vrai que de nombreux ajout du C99 sont étranges, c'est soit du sucre syntaxique bizarre qui rend le code encore + dur à lire, soit des extentions qui cassent beaucoup de conventions comme
int n = rand();
int tab[n]; // taille dynamique
sizeof tab // ce n'est pas une constante !

La norme qui casse les conventions (quand ce n'est pas du code), c'est la routine des programmeurs C.   :sol:  
 

Citation :

par contre les bons trucs du C++ ont été ajoutés, comme ça avait été le cas en 89 déjà (car le C++ c'est vieux qd même)

En 89, le C a aussi pas mal ignoré le C++, alors qu'il était déjà bien là.
 

Citation :

, les commentaires //, for (int i...), déclaration = instruction, bool, complex.
inline et restrict ça peut être utile pour l'optimisation, car le C il ne lui reste plus grand chose d'autre.


C'est surement pas inline et restrict qui vont contribuer à sa survie  :sol:


Message édité par ++fab le 13-02-2006 à 19:52:19
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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