Указатель '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();
}
Мне интересно узнать подробности, связанные с этим.
Ответы
Ответ 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
Идентификатор