Продление времени жизни временного элемента данных через 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 одинаковыми?

Ответы на вопрос(1)

Ваш ответ на вопрос