Я думаю, я не могу понять, почему это не работает. Я всегда думал, что могу использовать указатель 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();
}
Мне интересно знать детали, связанные с этим.
Просто потому, что в этом нет необходимости, список инициализаторов уже может быть неоднозначным, поскольку его синтаксис строг:
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
не было бы инициализировано сейчас, упс!
Вам нужно this
помочь компилятору:
A(int a = 0, int b = 0)
{
this->a = a; // set A::a to local a.
}
this->a
грамматически недопустим, потому что это выражение доступа к члену, но там разрешен только идентификатор (или спецификатор типа для базовых классов).
Из стандарта C ++ [class.base.init],
MEM-инициализатора идентификатор:
класса или-decltype
идентификатор