我想了解qazxsw poi的参考资料。我已经看到它们如何在构造函数中使用,像qazxsw poi和qazxsw poi这样的东西,但我仍然不明白为什么这不起作用:
rvalue
这样做:
std::move
为什么它与函数模板版本一起使用?
就像@Peter所说的那样,std::forward
的类型被推断为void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
,C ++的参考折叠规则说:
T&&⇒T+来自C ++ 98 T&&&⇒T&//适用于C ++ 0x的新功能 T&&&⇒T&//适用于C ++ 0x的新功能 T && &&⇒T&& // C ++ 0x的新功能
所以template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
的实例化实际上是:
T
它有效。
除了@ songyuanyao的答案之外还有一些正式的解释:
string&
:
模板参数推导是通过将每个函数模板参数类型(称为P)与调用的相应参数的类型(称为A)进行比较来完成的,如下所述。
func
:
转发引用是对cv-unqualified模板参数的rvalue引用。如果P是转发引用且参数是左值,则使用类型“对A的左值引用”代替A来进行类型推导。
标准还提供以下示例:
void func(string& str)
这正是你的情况。
因为模板内部N4296::14.8.2.1 [temp.deduct.call]
具有不同的含义,所以它被称为通用引用。
带有qazxsw poi参数的模板函数(通用引用)表示该参数可用作参考或rvalue-reference。
在您的情况下,模板被推断为N4296::14.8.2.1/3 [temp.deduct.call]
,这就是它的工作原理。
要使用原始函数,您必须执行以下操作:
template <class T> int f(T&& heisenreference);
template <class T> int g(const T&&);
int i;
int n1 = f(i); // calls f<int&>(int&)
int n2 = f(0); // calls f<int>(int&&)
int n3 = g(i); // error: would call g<int>(const int&&)
关于通用参考的完整解释可以在这里找到:&&