Я нашел следующую схему для продления временного рабочего времени, я не знаю, нужно ли это делать, но это так.
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
}
Почему это допустимо с помощью агрегата? Я думаю, что это связано с тем, что конструктор является фактическим вызовом функции, основанный на том, что у меня есть красный с константными комментариями. Кроме того, есть ли способ сделать последний случай работы?
Есть много вопросов, касающихся аналогичной ситуации, используя ссылки lvalue на SO. Я вижу, что если бы я использовал const lvalue ref, это не помогло бы продлить время жизни временного, будут ли правила для rvalue refs одинаковыми?