普遍类型扣除斯科特迈耶斯

时间:2015-11-23 07:04:37

标签: c++ c++11 effective-c++ forwarding-reference

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

在上面我有以下问题

  1. 作者的意思是“除非调用者明确指定它,否则我们不会关注自己的边缘情况”?请求提供一个示例,边缘案例作者提到调用者明确指定

1 个答案:

答案 0 :(得分:1)

作者指的是最终用户在f的调用中明确指定了type参数:

f<Widget>(w);