如何解决std::regular_invocable 和按值参数
以下示例是否有意违反前提条件?
#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
函数违反了该语义约束,因为它通过移动参数来修改参数。
这种解释有效吗?
解决方法
记住:参数就是你传入的;参数是函数看到的。第一个函数不能修改参数,因为它是按值获取参数的。这意味着参数是参数的副本。
然而,由于不同的原因,这两个函数都是错误的。第一个 lambda 违反了 "equality preserving" 的先决条件(这意味着,对于相同的参数,您得到相同的返回值)。
第二个甚至不应该编译,因为它的参数是按值获取的。 unique_ptr
是仅可移动的,除非它是可移动范围,否则视图不应从迭代器的内容移动。如果它确实编译了,它将违反您引用的前提条件,因为参数正在被修改为参数(移动是修改操作)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。