поведение const_cast - PullRequest
       30

поведение const_cast

1 голос
/ 03 февраля 2012

Я читал об операторе const_cast в c ++

1.Первая странная вещь, которую я не могу понять, это

Синтаксис оператора const_cast, т.е.

-const_cast - <- Вид -> - (- выражение -) --------------------> <</p>

Что я понимаю об этом синтаксисе, так это о том, что он помогает отбрасывать константу expression типа Type. Но рассмотрим этот код

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;
}

Здесь, в строке ConstTest *c = const_cast<ConstTest*>(this), я думаю, что константа this указателя должна быть отброшена, но выходные данные показывают, что это объект, к которому относится this, который теряет свое постоянство.

Мне кажется, что код должен был быть ConstTest *c = const_cast<ConstTest>(*this), но это приводит к ошибке. Я знаю, что ошибаюсь во многих интерпретациях. Пожалуйста, исправьте их все.

2.Мой второй проблемой является следующее утверждение

Результатом выражения const_cast является значение r, если тип не является ссылочным типом. В этом случае результатом будет lvalue.

Почему это так, и почему это не так в случае указателей?

1 Ответ

4 голосов
/ 03 февраля 2012

помогает отбросить константность выражения типа Тип

Нет, Type - это тип результата, а не тип операнда.

То, что я думаю, является константой этого указателя, должно быть отброшено

this имеет тип const ConstTest*.const_cast<ConstTest*>(this) имеет тип ConstTest*.Вот что означает «отбрасывание const» из указателя на const.

Мне кажется, код должен был быть ConstTest *c = const_cast<ConstTest>(*this)

Результат const_cast<T> имеетТип Т, вот как это определяется.Возможно, вы бы определили это по-другому, но, к счастью, вы не получите ConstTest*, написав const_cast<ConstTest>, вы получите его, написав const_cast<ConstTest*>.Ваш предпочтительный синтаксис недоступен.

Вы можете либо сделать ConstTest &c = const_cast<ConstTest&>(*this), либо ConstTest *c = const_cast<ConstTest*>(this), поэтому выберите свой любимый.

Результатом выражения const_cast является rvalue, если только не Typeявляется ссылочным типомВ этом случае результатом является lvalue.

почему так и почему это не так в случае указателей?

Это верно для указателей.ConstTest* не является ссылочным типом, а результат const_cast<ConstTest*>(this) является rvalue.Затем вы присваиваете это значение переменной c.

...