Является const_castкогда-нибудь полезный? - PullRequest
10 голосов
/ 16 марта 2011

Недавно я нашел фрагмент кода C ++, который эффективно выполняет следующее:

char* pointer = ...;
const char* constPointer = const_cast<const char*>( pointer );

Очевидно, что автор думал, что const_cast означает «добавить константу», но на самом деле const может быть таким жехорошо добавлено неявно:

const char* constPointer = pointer;

Есть ли какой-нибудь случай, когда мне действительно нужно было бы const_cast до указатель на const (const_cast<const Type*> как в примере выше)?

Ответы [ 4 ]

10 голосов
/ 16 марта 2011

Там, где у вас 2 перегрузки, и вы хотите принудительно выполнить константную.Это часто бывает, когда вы вызываете один в терминах другого.

class A
{
public:
   B* get();
   const B* get() const;
};

У меня неконстантный A, но я хочу запустить get () const, который я мог бы разыграть.В частности, я мог бы сделать это в реализации самого неконстантного.

B* A::get() 
{
   return const_cast<B*>( const_cast< const A*>(this)->get() );
}

Конечно, мы могли бы сделать:

B* A::get()
{
    const A* constthis = this; // no need to cast
    return const_cast<B*>(constthis->get());
}

, поэтому нам не нужно было приводить, но это делаетпервое решение - одна строка и нет необходимости создавать временную переменную.

5 голосов
/ 16 марта 2011

const_cast, несмотря на название, не относится к const; он работает с cv-qualifiers , который эффективно включает в себя const и volatile.

Хотя добавление такого классификатора разрешено прозрачно, для удаления любого требуется const_cast.

Поэтому в приведенном вами примере:

char* p = /**/;
char const* q = const_cast<char const*>(p);

присутствие const_cast является ложным (я лично думаю, что это скрывает синтаксис).

Но вы можете удалить volatile, в этом случае он вам понадобится:

char const volatile* p = /**/;
char const* q = const_cast<char const*>(p);

Это может появиться, например, в коде драйвера.

5 голосов
/ 16 марта 2011

Возможно принудительное разрешение перегрузки в случаях, когда у вас есть f (T *) и f (const T *).

2 голосов
/ 16 марта 2011

Вы также можете использовать static_cast, чтобы добавить const. Поэтому я не вижу ситуации, когда вам приходится использовать const_cast для добавления const. Но иногда может потребоваться явное приведение (будь то одно или другое), когда вы хотите изменить тип объекта, например для разрешения перегрузки.

1008 * Е.Г. *

void f(char*);
void f(const char*);

int main()
{
   char* p = 0;
   f(p); //calls f(char*)
   f(static_cast<const char*>(p)); //calls f(const char*);
   f(const_cast<const char*>(p)); //calls f(const char*);
}
...