Область переменной, инициализированной в списке параметров функции
Следующий код строит, компилирует и запускает (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});
,