首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20概念:需要表达和完美的转发

C++20概念:需要表达和完美的转发
EN

Stack Overflow用户
提问于 2020-01-20 18:08:27
回答 1查看 487关注 0票数 6

FYI: C++17 std::is_invocable_v所做的正是我所期望的。

假设有一个概念来检查对可调用对象的调用是否可以使用特定的参数类型:

代码语言:javascript
复制
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args&&... args)
{
    { std::invoke(request, std::forward<Args>(args)...) }-> Status;
};

对比

代码语言:javascript
复制
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args... args)
{
    { std::invoke(request, args...) }-> Status;
};

在requires表达式中使用完美转发是否有意义?

在我看来,答案是肯定的,因为请求可调用对象可能期望某些参数的rvalue。

但是,requires (Fn request, Args... args)是否表现为关于args...的lvalue性质的函数声明?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-20 18:24:36

它的行为会和它的样子完全一样。这就是requires表达式的意义所在:让这些东西看起来像C++。所以它的行为就像C++。

重要的是你如何使用这个概念。也就是说,当您基于某个模板进行requires时,您应该正确地调用这个概念。例如:

代码语言:javascript
复制
template<typename Func, typename ...Args
void constrained(Func func, Args &&...args)
  requires has_request_interface<Func, Args...>
{
  Status status = func(std::forward<Args>(args)...);
}

因此,如果您希望通过该概念进行转发,则您的概念需要使用&&和转发。

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

https://stackoverflow.com/questions/59828801

复制
相关文章

相似问题

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