Область переменной, инициализированной в списке параметров функции

Следующий код строит, компилирует и запускает (C++, mingw), казалось бы, без проблем. Тем не менее, я уверен, что объекты, созданные с помощью списков инициализаторов внутри списка параметров функции, живут в рамках этой функции, хотя функция принимает аргумент по ссылке?

Если нет, верно ли, что при создании объекта с использованием его списка инициализаций в списке параметров функции (который принимает аргумент по ссылке) может быть опасным, поскольку он сразу будет разрушен: в этом случае функция не имеет копия, но ссылка на память, которая может или не может быть перераспределена другим процессом?

struct S
{
  S() : a(0), b(0) {}
  S(int a, int b) : a(a), b(b) {}
  int a;
  int b;
};

void foo(const S& s)
{
  std::cout << "s.a = " << s.a << std::endl;
  std::cout << "s.b = " << s.b << std::endl;
}

int main()
{
  foo({4,5}); // <-- What is the scope of the struct initialized here?

  return 0;
}

Ответы

Ответ 1

Согласно cppreference [lifetime]:

Все временные объекты уничтожаются как последний шаг при оценке полного выражения, которое (лексически) содержит точку, в которой они были созданы, и если создано несколько временных объектов, они уничтожаются в порядке, противоположном порядку создания. Это справедливо, даже если эта оценка заканчивается выбросом исключения.

Это означает, что временный объект будет уничтожен после возвращения функции, поэтому он совершенно безопасен.

Ответ 2

Здесь prvalue материализовался, чтобы создать временный объект типа S из списка бит-init-list {4,5}, который уничтожается в конце полного выражения. В вашем случае foo({4,5}); ,