Допустимо ли присоединение к представлению преобразования, элементы которого являются временными контейнерами?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Допустимо ли присоединение к представлению преобразования, элементы которого являются временными контейнерами?

Сообщение Anonymous »

Рассмотрим этот пример C++23:

Код: Выделить всё

#include 
#include 
#include 

namespace r = std::ranges;
namespace rv = std::ranges::views;

std::vector consecutive_triple(int n) {
return { n, n + 1, n + 2 };
}

int main() {

std::vector numbers = { 0, 10, 20, 30, 40 };
auto more_numbers = numbers |
rv::transform(consecutive_triple) | rv::join;

// -- Does this help? ...
//auto more_numbers = numbers |
//    rv::transform(consecutive_triple) | rv::join |
//    r::to();

for (auto v : more_numbers) {
std::print("{} ", v);
}
std::println("");

return 0;

}
Каждый вызов последовательных_трипл возвращает временный std::vector, поэтому внутренние диапазоны в представлении преобразования представляют собой чистые значения r. Когда соединение пытается выполнить их итерацию, векторы больше не существуют.
Я считаю, что это связано с неопределенным поведением, поскольку время жизни поддиапазонов заканчивается до того, как объединение сможет их безопасно пройти.
Вопросы:
  • Гарантирует ли стандарт C++23 недопустимость/неопределенность этого значения?
  • Есть ли какой-нибудь стандартный способ написать это без явного создания контейнера, в котором будут храниться промежуточные векторы перед их объединением?


Подробнее здесь: https://stackoverflow.com/questions/797 ... containers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»