Я просматривал видео на YouTube о статике в С++, в котором я нашел фрагмент кода, который меня смущает.
#include<iostream>
using namespace std;
class Singleton {
static Singleton* s_instance;
public:
static Singleton& Get() { return *s_instance; }
void display() {
cout << "Hello" << endl;
}
};
Singleton* Singleton::s_instance=nullptr;
int main() {
Singleton::Get().display();
}
Интересно, почему компилятор не выдает ошибку, ведь мы возвращаем разыменованный объект nullptr в функции Get(). Кроме того, когда я пробовал то же самое, но с типом возврата функции Get(), установленным как Singleton вместо Singleton&, компилятор выдает ошибку, утверждающую, что s_instance является nullptr. Можете ли вы объяснить, имеет ли какое-то отношение к этому ссылочный тип возврата функции Get()?
this
, поэтому ему это сойдет с рук. Это по-прежнему UB, и компилятору не требуется обнаруживать или выдавать диагностику для UB. - person Useless   schedule 01.07.2021return *s_instance;
действительным или нет, невозможно во время компиляции, поэтому компилятору не требуется выдавать ошибку или предупреждение. Но во время выполнения это выражение вызывает неопределенное поведение, что означает, что может произойти что угодно. Обычно это просто приводит к сбою, и многие системы выдают сообщение об ошибке. - person churill   schedule 01.07.2021