【发布时间】:2015-02-09 03:24:21
【问题描述】:
考虑这段代码:
template<typename T>
void foo(T&& param){ //In this case && is called universal reference
std:string tmp = std::forward<string>(param);
}
我的问题是,如果可以推断出通用引用类型,为什么我还需要调用 forward ?
为什么不转发 tmp 的正确 c'tor 即使推导出了 T 的类型也不会被调用。
我的第二个问题是关于参考折叠规则:
-
A& &&变为A& -
A&& &&变为A&&
所以根据这个规则并考虑到通用参考为什么 std::forward 签名不能如下:
template<class T>
T&& forward(T&& arg){
return static_cast<T&&>(arg);
}
根据上面的规则,如果T的类型是右值引用,它将折叠为右值引用,如果T的类型是左值引用,它将折叠为左值引用。
那么为什么std::forward 有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?
【问题讨论】:
-
现在它们被称为“转发引用”。
-
什么是 T$$?那应该是T&&吗?
标签: c++ c++11 perfect-forwarding forwarding-reference