C++11模板参数的右值引用转发引用是何种引用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1339个文字,预计阅读时间需要6分钟。
在C++11中,不再仅有逻辑与运算的含意,还可能涉及右值引用的使用:`void f(int+i);`。但也可能涉及转换引用的使用:`template void g(T obj);`。所谓转换引用(forwarding reference)旧称通用引用(universal reference)。
在C++11中,&&不再只有逻辑与的含义,还可能是右值引用:
void f(int&& i);
但也不尽然,&&还可能是转发引用:
template<typename T> void g(T&& obj);
“转发引用”(forwarding reference)旧称“通用引用”(universal reference),它的“通用”之处在于你可以拿一个左值绑定给转发引用,但不能给右值引用:
void f(int&& i) { } template<typename T> void g(T&& obj) { } int main() { int n = 2; f(1); // f(n); // error g(1); g(n); }
一个函数的参数要想成为转发引用,必须满足:
- 参数类型为T&&,没有const或volatile;
- T必须是该函数的模板参数。
本文共计1339个文字,预计阅读时间需要6分钟。
在C++11中,不再仅有逻辑与运算的含意,还可能涉及右值引用的使用:`void f(int+i);`。但也可能涉及转换引用的使用:`template void g(T obj);`。所谓转换引用(forwarding reference)旧称通用引用(universal reference)。
在C++11中,&&不再只有逻辑与的含义,还可能是右值引用:
void f(int&& i);
但也不尽然,&&还可能是转发引用:
template<typename T> void g(T&& obj);
“转发引用”(forwarding reference)旧称“通用引用”(universal reference),它的“通用”之处在于你可以拿一个左值绑定给转发引用,但不能给右值引用:
void f(int&& i) { } template<typename T> void g(T&& obj) { } int main() { int n = 2; f(1); // f(n); // error g(1); g(n); }
一个函数的参数要想成为转发引用,必须满足:
- 参数类型为T&&,没有const或volatile;
- T必须是该函数的模板参数。

