c++ - 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 违反了“保持平等”的先决条件(这意味着,对于相同的参数,您会得到相同的返回值)。
第二个甚至不应该编译,因为它的参数是按值获取的。unique_ptr
s 是只能移动的,除非它是可移动的范围,否则视图不应该能够从迭代器的内容中移动。如果它确实编译,它将违反您引用的先决条件,因为参数正在被修改,因为它成为参数(移动是修改操作)。
推荐阅读
- google-bigquery - 数据流作业:无法将列分区表复制到列分区元表:不支持
- python - 你如何设置组合框网格的位置
- newlib - atollic - newlib - 堆栈损坏
- graphql - 从 graphql-js 切换到本机 graphql 模式?
- ios - 无法在表格视图中打印 Google+ 响应
- azure - Azure 应用服务停止工作一段时间
- vector - 如何将 .kmz 文件转换为 .zip?
- firebase - 在 Flutter 中使用 Firebase 身份验证检查用户是否是新用户
- c# - SMTP:邮箱不可用。服务器响应是:Error458 块
- javascript - 我们如何在 ES7 中调用类内部的方法?