2012-02-03 2 views
1

Je lisais à propos de l'opérateur const_cast en C++de const_cast

1.Premièrement chose bizarre chose que je ne comprends pas est

const_cast syntaxe de l'opérateur à savoir

-const_cast-- < --Type -> - (- expression -) --------------------> <

ce que j'ai comprendre au sujet de cette syntaxe est qu'il permet de jeter constness d'un écart expression de type Type considérer ce code .Mais

class ConstTest { 

private: 
    int year; 
public: 
    ConstTest() : year(2007) {} 
    void printYear() const; 
}; 

int main() { 
    ConstTest c; 
    c.printYear(); 
    return 0; 
} 

void ConstTest::printYear() const { 
    ConstTest *c = const_cast<ConstTest*>(this); 
    c->year = 42; 
    std::cout << "This is the year " << year << std::endl; 
} 

Ici, en ligne ConstTest *c = const_cast<ConstTest*>(this), je pense que le const de this pointeur doit être rejeté, mais la sortie montre que c'est l'objet que this fait référence à qui perd sa constance.

Je pense que le code aurait dû être ConstTest *c = const_cast<ConstTest>(*this), mais cela génère une erreur. Je sais que je me trompe à de nombreuses interprétations. Veuillez les corriger tous s'il vous plaît.

deuxième problème 2.my est la déclaration ci-dessous

Le résultat d'une expression const_cast est un rvalue sauf si le type est un type de référence. Dans ce cas, le résultat est une lvalue.

Pourquoi est-ce le cas et pourquoi cela n'est pas vrai dans le cas des pointeurs?

+0

Il est préférable d'éviter const_cast jusqu'à ce que vous compreniez mieux la langue. C'est très dangereux. –

Répondre

4

il aide à rejettera constness d'une expression de type type

Non, Type est le type du résultat, pas le type de l'opérateur.

Ce que je pense est const de ce pointeur doit être casté loin

this est de type const ConstTest*. const_cast<ConstTest*>(this) a le type ConstTest*. C'est ce que "couler const" d'un pointeur vers des moyens const.

je me sens le code aurait dû être ConstTest *c = const_cast<ConstTest>(*this)

Le résultat de const_cast<T> a le type T, qui est la façon dont il est défini. Peut-être que vous auriez défini différemment, mais difficile, vous n'obtenez pas ConstTest* en écrivant const_cast<ConstTest>, vous l'obtenez en écrivant const_cast<ConstTest*>. Votre syntaxe préférée n'est pas disponible. Vous pouvez faire ConstTest &c = const_cast<ConstTest&>(*this) ou ConstTest *c = const_cast<ConstTest*>(this), alors choisissez votre favori.

Le résultat d'une expression const_cast est un rvalue sauf si le type est un type de référence . Dans ce cas, le résultat est une lvalue. Pourquoi et pourquoi cela n'est pas vrai dans le cas de pointeurs?

Cela est vrai pour les pointeurs. ConstTest* n'est pas un type de référence et le résultat de const_cast<ConstTest*>(this) est un rvalue. Vous affectez ensuite cette valeur à la variable c.

+0

merci pour la réponse. –

+0

Cela ne devrait-il pas être 'ConstTest * const'? 'const ConstTest *' signifierait que les données pointées sont constantes et ne peuvent donc pas être modifiées. Aussi, quel est l'exemple d'un type de référence? Est-ce que le résultat de 'const_cast (* this)' est un type ref? Cela ne peut pas être une valeur car vous ne pouvez pas l'assigner. – greatwolf

+0

@greatwolf: Je voulais dire ce que j'ai écrit, dans la fonction membre 'printYear',' this' a le type 'const ConstTest *'. Cela signifie "pointer-to-const", même si avoir un pointeur-const ne signifie pas nécessairement que les données pointées ne peuvent pas être modifiées. Cela signifie simplement que vous ne pouvez pas le modifier via ce pointeur. Le résultat de 'const_cast (* this)' est en effet une lvalue, et a un type de référence. Vous vous trompez en disant que si quelque chose ne peut pas être assigné, il ne doit donc pas être une lvalue. Il y a des lvalues ​​modifiables et non modifiables. –

Questions connexes