Вопрос о const_cast в с ++ - PullRequest
       35

Вопрос о const_cast в с ++

9 голосов
/ 27 сентября 2010

все: это цитата из Effective C ++ 3-е издание

const_cast обычно используется для отбрасывания константности объектов. Это единственное приведение в стиле C ++, способное сделать это.

Мой вопрос: может ли const_cast добавить константность к неконстантному объекту? На самом деле я написал небольшую программу, пытаясь подтвердить мою мысль.

class ConstTest
{
 public:

 void test() {
    printf("calling non-const version test const function \n");
}

 void test() const{
    printf("calling const version test const function \n");

} 

};
 int main(int argc,char* argv){
 ConstTest ct;
 const ConstTest cct;
 cct.test();
 const_cast<const ConstTest&>(ct).test();//it is wrong to write this statement without the '&',why

}

Пропуск '&' приводит к ошибке ниже:

ошибка C2440: «const_cast»: невозможно преобразовать из «ConstTest» в «const ConstTest»

Это показывает, что const_cast может добавить константность, но кажется, что вам нужно привести к ссылке на объект, в чем же волшебство этой ссылки?

Ответы [ 4 ]

7 голосов
/ 27 сентября 2010

Вам не нужно const_cast для добавления константности:

class C;
C c;
C const& const_c = c;

И наоборот требуется const_cast хотя

const C const_c;
C& c = const_cast<C&>(const_c);

, но поведение не определено, если вы попытаетесьиспользовать неконстантные операции на c.

Кстати, если вы не используете ссылку, должна быть сделана копия объекта:

C d = const_c; // Copies const_c
3 голосов
/ 28 сентября 2010

const_cast также можно использовать для добавления константности.

$5.2.11/3 - "For two pointer types T1 and T2 where

T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T
and
T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T

where T is any object type or the void type and where cv1 ,k and cv2 ,k may be different cv-qualifications, an rvalue of type T1 may be explicitly converted to the type T2 using a const_cast. The result of a pointer const_cast refers to the original object.

Обратите внимание:

int *t1 = NULL;  // T = int, cv1, 0 = none
int * const t2 = const_cast<int * const>(t1);   // T = int, cv2, 0 = const

Согласно приведенной выше цитате, все в порядке, и это добавляет константу к t

Но, как говорит Херб Саттер , в большинстве случаев это явно не требуется.

2 голосов
/ 27 сентября 2010

const_cast можно использовать только для приведения к указателям и ссылкам.Его нельзя использовать для приведения к объектам.И вот почему: если у вас есть объект const, вы не можете сделать его неконстантным и наоборот - он уже const, вы не можете переопределить его.Вы можете попытаться получить к нему доступ только через указатель или ссылку без (или с) const.

1 голос
/ 27 сентября 2010

const_cast не может изменить постоянство значения. Таким образом, он возвращает константную ссылку на значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...