我正在阅读 Scott Meyers 的《Effective modern 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
为了使引用具有普遍性,类型推导是必要的,但这还不够。引用声明的形式也必须正确,而且 from 是相当受限制的。它必须是精确的“ 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.
在上面我有以下问题
- 作者所说的“除非调用者明确指定它,否则我们不会关心的边缘情况”是什么意思?请求提供示例什么是边缘案例作者提到调用者明确指定