【问题标题】:universal types deduction scott meyers通用类型演绎斯科特迈耶斯
【发布时间】:2015-11-23 07:04:36
【问题描述】:

我正在阅读 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&amp;&amp;”。

当 f 被调用时,类型 T 将被推导出(除非调用者明确指定它,这是我们不会关心的边缘情况)。但是param的类型声明形式不是“T&amp;&amp;”,而是“std::vector&lt;T&gt;&amp;&amp;”。这排除了 param 是通用参考的可能性。因此,param 是一个右值引用,如果您尝试将左值传递给 f,您的编译器会很乐意为您确认这一点。

std::vector<int> v;
f(v); // error! can't bind lvalue to rvalue reference.

在上面我有以下问题

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

【问题讨论】:

  • 作者所说的“除非调用者...”是什么意思 - f&lt;int&gt;(w)
  • 这个词后来改成了Forwarding Reference
  • @amit 如果用户指定类型,类型推导是否存在差异
  • 明确指定类型时没有类型推导

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


【解决方案1】:

作者指的是最终用户在调用f时显式指定类型参数:

f<Widget>(w);

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2014-08-15
    相关资源
    最近更新 更多