2011-12-29 4 views
2

Pourquoi jeter ce qui suit une erreur du compilateur:classe D invariant appel const fonctionne

class A 
{ 
public: 
    int f() const 
    { 
     return 5; 
    } 

protected: 
    invariant() 
    { 
     assert (f() == 5); 
    } 
} 

main.d(14): Error: cannot call public/export function f from invariant.

Je comprends le concept d'invariant; vous voulez vérifier l'état de la classe entre chaque appel public à une méthode.

Cependant, les fonctions membres immuables ou const ne peuvent pas modifier l'état de la classe (sauf si this a été passé?), Donc les vérifications invariantes entourant ces fonctions sont redondantes. L'appel invariant pourrait être laissé de côté et aucune boucle infinie n'apparaîtrait, ce qui fausse l'erreur du compilateur.


Je suis venu à ce que je crée des hiérarchies avec des objets qui définissent:

bool hasParent() const 
{ 
    return (parent !is null); 
} 

utilisant cette petite fonction est plus facile au sein de la classe, mais peut-être à l'extérieur aussi. Mais la définir publique défie invariant().

Répondre

1

C'est probablement une omission. N'hésitez pas à déposer une demande d'amélioration sur Bugzilla.

+2

Publié: http://d.puremagic.com/issues/show_bug.cgi?id=7182#c0 –