Задать вопрос
AtariSMN82
@AtariSMN82
Разработчик игр

С++ Как правильно вернуть ссылку?

Этот способ возврата ссылки корректен?
struct Test {
  int val {};
  ...
  int& get_val(bool good) {
    if (good)
      return val;
    return *(int*)0; // <----- етот
  }
};

Или лучше писать так:
struct Test {
  int val {};
  ...
  int& get_val(bool good) {
    if (good)
      return val;

    static int empty_val;
    return empty_val;
  }
};

Я понимаю что можно обойтись поинтерами на nullptr или std::optional, но всё равно интересно, не вызывает ли первый варик ошибок
  • Вопрос задан
  • 117 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Ссылка - это как указатель, только она не может быть нулевой.
Поэтому никак нельзя вернуть *nullptr_t вместо ссылки на переменную, в отдельных случаях.

Вообще, у вас там разыменование нулевого указатяля, что есть UB и делать это категорически нельзя.

Второй пример ошибок не содержит, но очень странен. Возвращать ссылку на какую-то переменную, только для того, чтобы не переписывать нужное значение? Все с ног на голову перевернуто.

Вам лучше подойдут указатели.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Sees_hk
return *(int *)0 читается как преобразуй C-style кастом rvalue значение (речь про 0) к типу который который должен иметь место в памяти - lvalue(речь про int*) и разыменуй. Смерть наступит еще на этапе каста.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы