“万能引用”
"万能引用"是C++中通用引用(Universal Reference)的非官方称呼,这个名字来源于Scott Meyers在其著作《Effective Modern C++》中的称呼。万能引用/通用引用主要是在C++11及以后的版本中出现的一种新的引用类型。
在C++中,万能引用主要与模板和类型推断一起使用。其形式通常是:T&&
。但这并不总是表示通用引用,它还可以表示右值引用。是否表示通用引用取决于T
是否是待推导的。
template<typename T> void foo(T&& arg) { // 这里的T&&是通用引用 // ... } int main() { int x = 0; foo(x); // foo<int&>(int&), T被推导为int&,所以T&&变成int& &&,根据引用折叠规则,变为int& foo(5); // foo<int>(int&&), T被推导为int,所以T&&变成int&& }
在上面的代码中,当foo
函数以左值作为参数时,T
被推导为左值引用;当foo
函数以右值作为参数时,T
被推导为它的原始类型。
这种特性使得函数可以以最优的方式处理参数,无论参数是左值还是右值。当参数是右值时,函数可以安全地移动它们;当参数是左值时,函数知道它必须复制或以其他方式避免修改它们。
这就是所谓的“万能引用”的核心概念:通过引用折叠和模板类型推断,C++函数可以自动适应左值和右值参数,提高代码的效率和灵活性。