什么是完美转发等于
What is Perfect Forwarding equal to
我知道这可以用来执行完美的转发:
template <typename A>
void foo(A&&) { /* */ }
这可用于对特定类型执行完美转发:
template <typename A, std::enable_if_t<std::is_same<std::decay_t<A>, int>::value, int> = 0>
void foo(A&&) { /* */ }
但这些只是函数的模板,这意味着,这些模板被扩展到一些函数,然后用于可能使用它的每个特殊情况。但是,这些是否扩展到:
void foo(A&)
和void foo(A&&)
或
void foo(A&)
和void foo(A)
我一直认为,这将是第一个,但后来我注意到,在这种情况下,您将无法使用A const
作为函数的参数,这当然有效。
但是,如果您使用正常的非常量左值,则第二个将是模棱两可的。它叫foo(A&)
还是foo(A)
?
这是
第一个。第二个没有多大意义:没有A
,A&&
是非引用类型。
如果参数是 cv T
类型的左值,则A
推导为 cv T&
。如果参数是 cv T
类型的右值,则A
被推导为 cv T
,A&&
是 cv T&&
。因此,当您传入const
左值时,生成的专用化是可以接受const
参数的专用化。
它们最初被Scott Meyers称为"Univeral References",现在是"Forwarding References"。
如您所见,引用部分没有更改。你传入任何类型的rvalue
,你会得到一个rvalue
参考。你传入任何类型的lvalue
,你会得到一个左值引用。生活就是这么简单。
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 完美的转发和构造函数
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 完美的对象转发阵列
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 完美的转发构造函数和已删除的构造函数
- 完美的转发功能推断出冲突错误
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估