首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::regular_invocable和by value参数

std::regular_invocable和by value参数
EN

Stack Overflow用户
提问于 2021-05-06 18:44:51
回答 1查看 86关注 0票数 0

是否打算在下面的示例中展示前置条件冲突?

代码语言:javascript
复制
#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_viewF fun有限制,要求它必须为regular_invocable<F&, range_reference_t<V>>。正如[concept.regularinvocable]中所写的,regular_invocable“不得修改函数对象或参数”。因此,r2函数违反了语义约束,因为它通过移动参数来修改参数。

这种解释有效吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 21:26:09

记住:参数是你传入的;参数是函数看到的。第一个函数不能修改参数,因为它是按值接受参数的。这意味着该参数是该参数的副本。

然而,由于不同的原因,这两个函数都是错误的。第一个lambda函数违反了"equality preserving"的前提条件(这意味着,对于相同的参数,您将获得相同的返回值)。

第二个函数甚至不应该编译,因为它的参数是通过值获取的。unique_ptr是只移动的,视图应该不能从迭代器的内容中移动,除非它是可移动的范围。如果它编译了,它将违反您引用的前提条件,因为参数在变成参数时被修改(move是一个修改操作)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67416577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档