考虑这段代码:
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
's 的类型是右值引用,它将折叠为右值引用,如果 T 的类型是左值引用,它将折叠为左值引用。
那么为什么std::forward
有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?