назначить не-stati c const член в классе с const_cast - PullRequest
0 голосов
/ 23 марта 2020

Почему постоянный член c может быть назначен с помощью const_cast, и когда это будет полезно?

В следующем коде классы A и B компилируются и работают нормально. Однако для B его константный член s инициализируется не с использованием списка инициализаторов в конструкторе, а путем удаления const с помощью const_cast и передачи ему значения по ссылке. Его также можно записать как (строка &) s = _s;

Я не часто вижу const_cast в левой части задания, но этот, похоже, работает нормально. Каковы плюсы и минусы конструктора B?

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class A {
public:
    A(const string& _s) : s(_s) {}
    void display() {cout << s << endl;}
private:
    const string s;
};

class B {
public:
    B(const string& _s) {
        const_cast<string&>(s) = _s;
    }
    void display() {cout << s << endl;}
private:
    const string s;
};

int main() {
    A a("abc");
    a.display();
    B b("def");
    b.display();
    return EXIT_SUCCESS;
}

Вывод:

abc
def

1 Ответ

3 голосов
/ 23 марта 2020

Почему постоянный член c const может быть назначен с помощью const_cast, и когда это будет полезно?

Зависит от того, что вы подразумеваете под словом "can".

Программа правильно сформирована, потому что вы изменяете неконстантное значение l.

Поведение программы не определено, потому что вы изменяете объект const.

и когда это будет полезно?

Изменение объекта const никогда не может быть полезным.

Удаление const из ссылки иногда, хотя и редко, полезно, поэтому существует const_cast. Но это полезно только тогда, когда у вас есть константная ссылка на неконстантный объект.

Каковы плюсы ... конструктора B?

Нет.

Каковы ... минусы конструктора B?

Поведение программы не определено, если вызывается конструктор B.

...