ключевое слово «this» для переменной const в инициализирующем списке

#c

#c

Вопрос:

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

 class Student {
public :
    int age;
    const int rollNumber;
    int amp;x;     // age reference variable

    Student(int r, int age) : rollNumber(r), this->age(age), x(this -> age) {
        //rollNumber = r;
    }
  

«Это» работает:

 class Student {
public :
    int age;
    const int rollNumber;int amp;x;


    Student(int r, int age) : rollNumber(r), x(this -> age) {
        //rollNumber = r;
    }
  

Я знаю, что мы должны объявлять и инициализировать const переменные и ссылаться на них одновременно, но я хочу инициализировать их после ввода и передачи моим объектам

Комментарии:

1. Вы уверены, что ваш второй пример работает? Я не вижу объявления для x .

2. Также обратите внимание, что элементы будут инициализироваться в том порядке, в котором они объявлены в классе; вы должны сохранять списки инициализаторов элементов в том же порядке, чтобы избежать случайного вызова UB.

3. @0x5453 да, это должно было быть объявлено . просто отредактировал это.

Ответ №1:

Короткий ответ: «так было решено, что синтаксис будет таким», но с философской точки зрения вы могли бы сказать, что этого this->age не существует в списке инициализаторов (поскольку вы еще не создали this …). Просто:

 age(age)
  

это правильный синтаксис, и из контекста ясно, что age есть что здесь.

Комментарии:

1. Я понимаю это. Вы сказали, что мы еще не создали this (перед областью видимости конструктора в списке инициализации) Но это не должно работать и для ссылочной переменной amp; x тоже. Я думаю, мы можем просто сказать, что так был определен синтаксис! Спасибо

2. @sarthakbansal Я согласен, что там есть некоторое несоответствие, но его тоже можно устранить философски (как и большинство вещей :)) — Из контекста, age в круглых скобках должен быть аргумент age , поэтому, если бы мы не разрешили только в ссылках явно ссылаться this->member , мы не смогли бы инициализировать ссылку (ну, мы могли бы, на временный аргумент, что не имеет смысла)! Конечно, это не имело бы смысла ни для чего, кроме ссылки или указателя. Однако это вызывает некоторую путаницу.