Предполагается ли, что следующий пример демонстрирует нарушение предусловия?
#include <memory>
#include <iostream>
#include <vector>
#include <ranges>
int main() {
std::vector<int> x{1, 2, 3, 4};
auto r = x | std::views::transform([](int x){return std::make_unique<int>(x); });
auto r2 = r | std::views::transform([](std::unique_ptr<int> v){
return *v;
});
for(auto i : r2) {
std::cout << i << ' ';
}
}
std::ranges::transform_view
имеет ограничение на F fun
, которое должно быть regular_invocable<F&, range_reference_t<V>>
. Как написано в [concept.regularinvocable] regular_invocable
не должен изменять объект функции или аргументы. Таким образом, функция r2
нарушает это семантическое ограничение, поскольку она изменяет аргумент, уходя от него.
Верна ли эта интерпретация?