почему complier разрешает Инициализацию Класса со ссылкой на конструктор по умолчанию - PullRequest
0 голосов
/ 03 мая 2020

Я изучаю C ++ primer 5th и знаю, что инициализаторы конструктора требуются, когда класс определяет ссылочный член, иначе компилятор жаловался бы на это.

Однако я написал фабричный метод stati c, получающий класс с пустым оператором.

#include <iostream>

using namespace std;

//Learning default initializing values.
class Default {
   public:
    Default(int t) : r(t) {}
    static Default FromDefault() {}

    friend ostream& operator<<(ostream& os, const Default& d) {
        os << "c " << d.c << endl
           << "a " << d.a << endl
           << "b " << d.b << endl
           << "d " << d.d << endl
           << "l " << d.l << endl;
        return os;
    }

   private:
    int& r;  //a reference which require to be initialized
    char c;
    int a;
    float b;
    double d;
    long l;
};

int main() {
    cout << Default::FromDefault();
    return 0;
}

Я думал, что код не пройдет компилятор, но он прошел. Пока я не использую член r, ошибки не будет.

Кажется, что элемент ссылочного класса не был инициализирован, и мне просто интересно, почему компилятор не обнаружит эту ошибку!

1 Ответ

4 голосов
/ 03 мая 2020

FromDefault демонстрирует неопределенное поведение, достигая закрывающей скобки, не встречая оператора return.


На несвязанной ноте конструктор Default(int t) связывает ссылку r с локальная переменная. Как только конструктор возвращается, t уничтожается и r становится висящим. Любая попытка использовать его впоследствии показала бы неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...