Можно ли изменить значение const с помощью списка инициализаторов? - PullRequest
0 голосов
/ 30 мая 2019

Я инициализировал ссылку на константу z и попытался повторно инициализировать ее, используя список инициализаторов, и вывод, который я получаю, является измененным значением.Нет ошибок, нет предупреждений.

#include <iostream>
using namespace std;
class Point {
    private:
    const int &z=9;

    public:
    Point (int &c):z(c){}

    int get_setz(){
        return z;
    }

};

int main()
{
    int m=3;
    Point p(m);
    cout << p.get_setz();
    return 0;
}

Output :
3

1 Ответ

5 голосов
/ 30 мая 2019

Я инициализировал ссылку на константу z и попытался повторно инициализировать

Вы пытались, но не пытались. Когда для инициализации члена используется список инициализации члена конструктора, любой инициализатор члена по умолчанию игнорируется. z никогда не ссылался на временное значение со значением 9. Таким образом, правила C ++ все еще очень важны, вы не можете пересылать ссылку, и никогда не было даже попытки сделать это.

И если бы вы не инициализировали z с помощью c, у вас в руках была бы свисающая ссылка и код с неопределенным поведением. Потому что 9 это не объект, это литерал. Ссылки могут привязываться только к объектам, поэтому вы привязали бы его к временному объекту, который вышел бы из области видимости после завершения инициализации вашего объекта.

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