Продление времени жизни временного элемента данных через rvalue работает с агрегатом, а не с конструктором. Почему?
Я нашел следующую схему, чтобы продлить время жизни временные работы, я не знаю, если это должно, но это делает.
struct S {
std::vector<int>&& vec;
};
int main() {
S s1{std::vector<int>(5)}; // construct with temporary
std::cout << s1.vec[0] << '\n'; // fine, temporary is alive
}
Однако когдаS
дается явный конструктор значений, он больше не является агрегатом, и эта схема завершается с ошибкой чтенияs1.vec[0]
struct S {
std::vector<int>&& vec;
S(std::vector<int>&& v)
: vec{std::move(v)} // bind to the temporary provided
{ }
};
int main() {
S s1{std::vector<int>(5)}; // construct with temporary
std::cout << s1.vec[0] << '\n'; // not ok. invalid read on free'd memory
}
Почему это верно для совокупности? Я думаю, что это связано с тем, что конструктор является фактическим вызовом функции, основываясь на том, что я выделил с помощью const lvalue refs. Кроме того, есть ли способ заставить последний случай работать?
Существует множество вопросов, касающихся аналогичной ситуации с использованием ссылок на lvalue в SO. Я вижу, что если бы я использовал const lvalue ref, это не помогло бы продлить срок жизни временного файла, являются ли правила для rvalue ref одинаковыми?