Ссылка на значение или нет - PullRequest
0 голосов
/ 06 июня 2018

Интересно, будет ли следующий код работать корректно с переменными v и v2 или это ссылки на временные переменные?Другими словами, могу ли я получить возвращенное значение по ссылке?Я думаю нет, но мой руководитель команды думает иначе.

#include <iostream>

struct Foo {
  Foo(Foo&&) = delete;
  Foo& operator=(Foo&&) = delete;

  Foo() {
    std::cout << "Constructor" <<std::endl;
  }
  Foo(const Foo&) {
    std::cout << "Copy Constructor" <<std::endl;
  }
  Foo& operator=(const Foo&) {
    std::cout << "Copy  = Constructor" <<std::endl;
    return *this;
  }
  ~Foo() {
    std::cout << "Destructor" <<std::endl;
  }
};

Foo foo() {
  Foo v;
  return v;
}

int main() {
  const auto& v = foo();
  const auto& v2 = v;
  return 0;
}

1 Ответ

0 голосов
/ 06 июня 2018

Да, это прекрасно работает и его поведение определено.

const auto& v = foo();

Это привязывает временную ссылку к ссылке.Срок действия временного будет продлен, чтобы соответствовать времени жизни v.(Привязка временных ссылок к константным ссылкам поддерживалась в C ++ 03 даже до того, как ссылки на rvalue стали чем-то особенным.)

const auto& v2 = v;

Это просто принимает другую ссылку на тот же объект.Это в основном неоперация, которая будет устранена во время компиляцииПока v2 не переживает v (что в данном случае не происходит), проблем не будет.

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