Могу ли я использовать "это" с делегирующими конструкторами?
В C++11 появилась возможность делегировать конструкцию от одного конструктора другому - "делегирование конструкторов".
Но - при этом мы можем использовать указатель this? например, в качестве аргумента одному из конструкторов, которому мы делегируем? Нетрудно предположить, что мы можем, пока "настоящий конструктор" еще не был вызван.
1 ответ
Для окончательного ответа нужно прочитать стандарт (и даже там это может быть не совсем ясно, см. Комментарий @BenjaminBanner). Но на практике - да, по-видимому, мы можем использовать this
в конструкторе делегации.
Следующий пример:
#include <iostream>
struct A {
A(int x_, void* p_) : x(x_), p(p_) { }
A(void* p_) : A(0, p_) { }
A() : A(this) { }
int x;
void* p;
};
int main() {
A a;
std::cout << "&a == " << &a << "\n";
std::cout << "a.p == " << a.p << "\n";
}
компилирует (GodBolt) со всеми GCC, Clang и MSVC. Они не предупреждают об этом, даже с -Wall -Wpedantic -Wextra
или же /W4
для MSVC.
Он также запускается (coliru.com) и выдает ожидаемый результат (по ссылке у вас есть версия, скомпилированная в g++, clang++ также можно проверить там).