C++20理念:要求表达和完美转发
C++20 concept : requires expression and perfect forwarding
仅供参考:C++17 std::is_invocable_v 完全符合我的预期。
想象一个概念来检查是否可以使用特定的参数类型调用可调用对象:
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args&&... args)
{
{ std::invoke(request, std::forward<Args>(args)...) }-> Status;
};
对
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args... args)
{
{ std::invoke(request, args...) }-> Status;
};
在需要表达式中使用完美转发有意义吗?
在我看来,答案是肯定的,因为请求可调用对象可能需要某些参数的右值。
但是requires (Fn request, Args... args)
是否表现为关于args...
的左值性质的函数声明?
它的行为与它的外观完全一样。这就是requires
表达的意义所在:让这些东西看起来像C++。所以它会表现得像C++。
重要的是你如何使用这个概念。也就是说,当您基于它requires
某个模板时,您应该正确调用该概念。例如:
template<typename Func, typename ...Args
void constrained(Func func, Args &&...args)
requires has_request_interface<Func, Args...>
{
Status status = func(std::forward<Args>(args)...);
}
所以是的,如果你想通过概念转发工作,你的概念需要使用&&
和转发。
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估
- 使用auto&&完美转发返回值
- 完美转发可变参数模板参数到成员函数
- 无需使用 ODR 即可实现完美转发
- 使用模板类完美转发