Подтвердить что ты не робот

Указатель 'this' в списке инициализации конструктора

Я думаю, я не могу понять, почему это не работает. Я всегда думал, что я могу использовать указатель 'this' внутри конструктора, но я никогда не знал, что не могу использовать 'this' в списке инициализации.

#include <iostream>

class A {
    public:
        int a;
        int b;
        A(int a = 0, int b = 0) : this->a(a), this->b(b) { }
        void print() {
        std::cout << a << ", " << b << std::endl;
    }
};

int main() {
    A a;
    a.print();
}

Мне интересно узнать подробности, связанные с этим.

4b9b3361

Ответ 1

Просто потому, что нет необходимости, список инициализаторов уже может быть неоднозначным, потому что его синтаксис строгий:

member(value)

Поэтому вы можете просто изменить его на:

A(int a = 0, int b = 0) : a(a), b(b) {}

this->member действительно используется, когда программисту необходимо помочь компилятору устранить неоднозначность, например, если бы ваш конструктор выглядел бы так:

A(int a = 0, int b = 0) 
{ 
  // set local 'a' to itself
  a = a; 
}

A::a ваш A::a не был бы инициализирован, oops!

Вам понадобится this чтобы помочь компилятору:

A(int a = 0, int b = 0) 
{ 
  this->a = a; // set A::a to local a.
}

Ответ 2

this->a является грамматически недействительным, поскольку это выражение для доступа к члену, но допускается только идентификатор (или спецификатор типа для базовых классов).

Из стандарта С++ [class.base.init],

мем-инициализатор-ID:
класса или-decltype
Идентификатор