我正在阅读Scott Meyers的有效现代C ++
对于作为函数参数的通用引用,初始化程序在调用站点提供。
template<typename T>
void f(T&& param); // param is a universal reference.
Widget w;
f(w)
f(std::move(w));
template<typename T>
void f(std::vector<T>&& param); // param is an rvalue reference
为了参考通用,类型扣除是必要的,但这还不够。引用声明的形式也必须是正确的,并且来自非常有限。它必须是“T&&
”。
当调用f时,将推导出类型T
(除非调用者明确指定它,我们不会关注的边缘情况)。但是param类型声明的形式不是“T&&
”,而是“std::vector<T>&&
”。这排除了param作为通用参考的可能性。因此,param是一个右值引用,如果您尝试将左值传递给f
std::vector<int> v;
f(v); // error! can't bind lvalue to rvalue reference.
在上面我有以下问题
答案 0 :(得分:1)
作者指的是最终用户在f
的调用中明确指定了type参数:
f<Widget>(w);