2

我正在阅读 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.

在上面我有以下问题

  1. 作者所说的“除非调用者明确指定它,否则我们不会关心的边缘情况”是什么意思?请求提供示例什么是边缘案例作者提到调用者明确指定
4

1 回答 1

1

作者指的是最终用户在调用中明确指定类型参数f

f<Widget>(w);
于 2015-11-23T07:10:38.633 回答