Согласно стандарту (§5.2.11) const_cast отбрасывает квалификаторы cv (const или volatile).
Вот простой пример.Сначала вы объявляете две функции с указателем и ссылкой:
class Bar { ... };
void foo_ptr(Bar*);
void foo_ref(Bar&);
, затем создаете ссылку на const:
Bar b;
const Bar& cb = b;
, а затем вы можете вызвать любую функцию с помощьюподходящий const_cast:
foo_ptr(const_cast<Bar*>(&cb));
foo_ref(const_cast<Bar&>(cb));
Вот мой вопрос: поскольку const_cast не может делать то, для чего были разработаны другие приведения, разве не очевидно, к чему вы кидаете?Другими словами, почему язык не позволяет мне просто сказать:
foo_ptr(const_cast<>(&cb));
foo_ref(const_cast<>(cb));
Я могу думать только о следующих двух причинах:
a) Компилятор должен остановить меня, когда япопробуйте сделать что-нибудь сумасшедшее, например:
foo_ptr(const_cast<int*>(&cb));
foo_ref(const_cast<int&>(cb));
, и если вы заставите меня явно указать тип, который я на него применяю, это может удержать меня от неправильного поведения.Я нахожу это (гипотетическое) объяснение слабым, поскольку было бы странно, если бы язык позволял мне записывать что-то неправильное только для того, чтобы компилятор исправил меня.
b) Существует возможная неоднозначность, если переменнаяи постоянный и изменчивый.В этом случае компилятор не сможет сказать, пытаюсь ли я отбросить одно или другое (или оба).
Это причина или другая причина?