|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Bonjour,
décidemment, 2 ans de C# et je n'y comprend plus rien au c++ ![]() Prenons le code suivant: Code :
En plus mon compilateur (VS 2010) est complètement perdu, l'erreur qu'il me donne est sans rapport: Citation:
Sauriez-vous me dire pourquoi cette dernière ligne ne compile pas? Il me semblait que le cast en référence constante était automatique. |
|||
|
|
00
|
|
|
#2 |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 546 ![]() |
Bonjour,
parce qu'il n'existe pas de fonction Foo qui prend un const std::string& en pramètres. Foo est un constructeur et la syntaxe est
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Mais pourtant fonctionne
|
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Inscription : mai 2008 Messages : 937 ![]() |
Il me semble que cette écriture en fait déclare une variable locale "test" de type Foo, exactement comme si l'on avait écrit Foo test; Les parenthèses sont ignorées.
De la même manière on peut déclarer double (d); au lieu de double d; même si ça ne sert pas à grand chose à part embrouiller le lecteur. Ce n'est pas si embêtant qu'il n'y parait vu qu'en pratique on ne va jamais appeler un constructeur directement et créer un objet temporaire mais plutôt écrire : Et dans ce cas tout se passe comme prévu. Edit : Par exemple Code :
ctor int ctor toto Faut avouer que Les designers du C# en partant de zéro ont eu l'avantage de pouvoir éviter ce genre d’ambiguïté dans la grammaire héritée du C
|
||
|
|
00
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Citation:
L'idée c'est que j'ai mon logger en singleton (ou variable globale c'est pareil), et je comptais faire une fonction libre dans le style: Code :
void my_log( mon_looger.instance()->Log( "blabla" ); Et j'en suis donc arrivé à une classe Log dont le constructeur prend un const string & en paramètre et c'est ce constructeur qui effectue le log. Et ça marchait très bien jusqu'à aujourd'hui où j'ai essayé de logger un objet string (jusqu'ici je ne loggais que des chaines du type "blabla" ). |
|
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
A noter également que, en utilisant l'exemple du premier post, le code suivant fonctionne:
Code :
|
||
|
|
00
|
|
|
#7 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 060 ![]() |
La syntaxe d'une déclaration c'est :
Où T est "presque" (*) le type et les Dn des "déclarateurs". Et il se trouve que si un Dn à la forme : Alors les parenthèses ne servent "à rien". En effet dans certains cas la syntaxe : A l'effet que tu attends, mais il ne faut pas oublier que le C++ a une grammaire qui est évaluée en fonction du contexte. Et la grammaire des déclarations semble prioritaire sur celle des expressions (ce qui n'est pas illogique étant donné que la grammaire des expressions régit un fonctionnement "plus fin" que celle des déclarations). Ca c'était la partie "grammaire", maintenant il y a quelque chose qui me gène dans le fait que tu voudrais que : Code :
Foo(test); //Tout seul, sans rien autour Le C++ n'est pas un langage pure, mais là c'est quand même un effet de bord un peu fort. Sans compter que les objets temporaires (donc les appels aux constructeurs/destructeurs) sont un point sur lequel les compilateurs optimisent, y introduire des effets de bord nécessaires c'est courir au devant de problèmes incompréhensibles. Pour revenir à ton problème, mets les parenthèses autour de Foo et pas de test, tu auras le comportement que tu veux (c'est une notation de cast, mais si ton constructeur n'est pas explicite, ça aura bien le comportement voulu : construire un Foo depuis un string). Sauf si ça optimise encore une fois. (*) Dans int * i; T est int et D *i, d'où mon "presque", idem pour la référence et d'autre élément dans le cas d'autre déclaration.
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com