完美的转发
Perfect forwarding
如果我们有以下内容:
template <class T>
struct B{
T data;
}
struct A{
int data_array[100];
}
int main()
{
A x;
const A x_const;
auto y1 = f(A());
auto y2 = f(x);
auto y3 = f(x_const);
auto y4 = f(std::move(x));
}
我想知道一个f
(最好是函数,但宏也可以),这样:
decltype(y1) == B<A>
decltype(y2) == B<A&>
decltype(y3) == B<const A&>
decltype(y4) == B<A&&>
也就是说,f
将x
完美地转发到B
的对象中。
这是不可能的。对于y1
和y4
,它们都采用类型A的右值,但您希望它们返回不同的类型。f
应该如何知道返回什么?
template <typename T>
auto f(T&& t) -> B<decltype(std::forward<T>(t))>
{
return B<decltype(std::forward<T>(t))>{std::forward<T>(t)};
}
这几乎实现了您想要的。唯一的区别是第一个类型是B<A&&>
而不是B<A>
。
auto y1 = f(A());
auto y4 = f(std::move(x));
将不可区分,因为A()
产生将与A&&
结合的临时。
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 完美的转发和构造函数
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 完美的对象转发阵列
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 完美的转发构造函数和已删除的构造函数
- 完美的转发功能推断出冲突错误
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估