2014-06-16 3 views
3

Dans D Je peux spécifier des fonctions const, comme dans C++:fonction membre Const vs Type const de retour

struct Person { 
    string name; 

    // these two are the same? 
    const string getConstName() { return name; }  
    string getConstName2() const { return name; } 
} 

Il semble que les deux ci-dessus sont la même signification. Est-ce vrai?

Si oui, comment puis-je retourner une chaîne const plutôt que de définir une fonction const?

+0

duplication possible de [Provide @property pour les structures const et non-const dans D] (http://stackoverflow.com/questions/24160745/provide-property-for-const-and-non-const-structures-in -d) – burner

Répondre

8

Les deux sont identiques. Les attributs de fonction peuvent aller de chaque côté d'une fonction. par exemple.

pure Bar foo() {...} 

et

Bar foo() pure {...} 

sont identiques. La même chose vaut pour pure, nothrow, const, etc. Ceci est probablement très bien pour la plupart des attributs, mais il devient assez ennuyeux quand const, immutable, ou inout est impliqué, car ils peuvent tous affecter le type de retour. Pour que ces attributs affectent le type de retour, les parens doivent être utilisés. par exemple.

const(Bar) foo() {...} 

renvoie un const Bar, alors

Bar foo const {...} 

et

const Bar foo() {...} 

retour un mutable Bar, mais la fonction membre lui-même est const. Dans la plupart des cas ce que vous voulez est probablement soit

Bar foo() {...} 

ou

const(Bar) foo() const {...} 

car il est souvent le cas que d'avoir une force de fonction de membre const vous pour revenir const (surtout si vous retournez une variable membre), mais vous pouvez avoir n'importe quelle combinaison const entre la fonction membre et son type de retour juste tant qu'elle fonctionne avec ce que fait la fonction (par exemple retourner une référence mutable à une variable membre ne fonctionne pas à partir d'une fonction const).

Maintenant personnellement, je souhaite que mettre const sur le côté gauche était illégal, en particulier quand l'excuse que tous les attributs de fonction peuvent aller de chaque côté de la fonction n'est pas vraiment vrai de toute façon (par exemple static, public, and private don't seem to be able to go on the right-hand side), mais malheureusement , c'est comme ça à ce moment-ci, et je doute que ça va changer, parce que personne n'a pu convaincre Walter Bright que c'est une mauvaise idée de laisser const aller sur la gauche.

Cependant, il est généralement considéré comme une mauvaise pratique de mettre const, immutable ou inout sur le côté gauche de la fonction, à moins qu'ils utilisent parens et donc d'affecter le type de retour, précisément parce que si elles sont sur la gauche sans parens, vous devez immédiatement vous demander si le programmeur qui l'a fait voulait modifier la fonction ou le type de retour. Donc, le laisser sur la gauche est assez inutile (à part peut-être pour le code générique, mais ce n'est toujours pas la peine de le permettre à mon humble avis).

+1

Merci. c'est en effet très peu intuitif .. –

+1

Encore une chose. Qu'en est-il de 'const' pour les fonctions (pas les méthodes membres). Les fonctions ne peuvent pas être 'const' dans le sens des méthodes, donc' const' se réfère toujours au type de retour dans les fonctions? –

+4

@ user3733425 Je n'avais jamais pensé à ça avant, mais en l'essayant, il semblerait que si vous mettez 'const' du côté droit d'une fonction libre, vous obtenez une erreur, mais si vous la placez sur la gauche, c'est juste ignoré. Donc, oui, cela fait toujours référence à la fonction et non au type, mais pour une raison quelconque, le compilateur l'ignore quand il est sur la gauche plutôt que de donner une erreur. –

Questions connexes