Могу ли я использовать "это" с делегирующими конструкторами?

В 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++ также можно проверить там).

Другие вопросы по тегам