C ++,函数参数中的右值引用

问题描述 投票:15回答:3

我想了解qazxsw poi的参考资料。我已经看到它们如何在构造函数中使用,像qazxsw poi和qazxsw poi这样的东西,但我仍然不明白为什么这不起作用:

rvalue

这样做:

std::move

为什么它与函数模板版本一起使用?

c++ c++11 templates rvalue-reference
3个回答
15
投票

就像@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

它有效。


6
投票

除了@ songyuanyao的答案之外还有一些正式的解释:

string&

模板参数推导是通过将每个函数模板参数类型(称为P)与调用的相应参数的类型(称为A)进行比较来完成的,如下所述。

func

转发引用是对cv-unqualified模板参数的rvalue引用。如果P是转发引用且参数是左值,则使用类型“对A的左值引用”代替A来进行类型推导。

标准还提供以下示例:

void func(string& str)

这正是你的情况。


0
投票

因为模板内部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&&)

关于通用参考的完整解释可以在这里找到:&&

© www.soinside.com 2019 - 2024. All rights reserved.