为什么模板化右值引用接受左值?

2023-11-29

我看到类似的用法

#include <iostream>
#include <functional>
using namespace std;

template<typename FN>
void Foo(FN&& Fn)
{
    Fn();
}


void b()
{
    cout << "2." << endl;
}

int main() 
{
    Foo([](){ cout << "1." << endl; });
    Foo(&b);

    auto c = []() { cout << "3." << endl; };

    Foo(c);

    std::function<void(void)> d = c;

    Foo(d);

    return 0;
}

我相当确定“c”是一个左值,但我可以相信存在一些 lambda 类型推导恶作剧。但我几乎 100% 确定,d 是左值。

如果函数接受右值,但 d 是左值,为什么模板化的东西可以工作?

此外,为什么人们会这样写 Foo 的签名而不是仅仅这样

template<typename FN>
void Foo(FN Fn)

扣除规则T&&很棘手。

他们的目的是做出一个推论T&&“转发参考”(或“通用参考”)。

首先,参考崩溃。假设您有一个未知的 X 型。现在X没有被推导出来。

然后,如果我们检查以下类型的变量:

typedef X x0;
typedef X& x1;
typedef X const& x2;
typedef X&& x3;

我们设置X成为其中之一int, int&, int const& and int&&,我们得到:

X is --->  int         int&      int const&      int&&
X          int         int&      int const&      int&&
X&         int&        int&      int const&      int&
X const&   int const&  int&      int const&      int&
X&&        int&&       int&      int const&      int&&

活生生的例子.

接下来是扣除规则。如果你通过了X& to T&&在推论的背景下,T推论为X&。这导致T&&成为X&通过上述参考折叠规则。类似的事情发生在X const&.

如果你通过了X&& to T&&,它推导出T to be X. T&&变成X&&以及。

在他们两人之间,在推论的背景下,template<class T> void foo(T&&t)是一个通用引用(好吧,现在称为转发引用)。

您可以恢复 r/l 值类别t with std::forward<T>(t),因此称为转发引用。

这允许一个模板处理 l 和 r 值,并使用std::forward如果你愿意的话,类似的机器的行为也会略有不同。

仅处理右值需要额外的工作:您必须使用 SFINAE 或其他重载(可能使用=delete)。仅处理左值很容易(只需推断T&).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么模板化右值引用接受左值? 的相关文章

随机推荐

  • 存储过程和针对未知进行优化

    我已经阅读了 SQL Server 2008 OPTIMIZE FOR UNKNOWN 查询提示 我明白它是如何运作的 不过 我有一个问题where and when使用它 不能在 UDF 内指定它 它可以在存储过程中指定 然而 thisM
  • 从管道命令读取文件名

    所以我试图让 C 程序从命令行读取以下格式的文件名 cat 文件名路径 节目名称 当它作为命令行参数输入时 我可以让它读取输入文件的名称 但它不会从连接的参数中读取 这是代码 现在它读取文件名 就像在命令行上的程序名称后面写入一样 incl
  • 在 Vec 的中间或开头有效地插入或替换多个元素?

    有没有直接的方法来插入或替换多个元素 T and or Vec
  • 计算假期:Oracle中查询给定日期范围内的星期六和星期日的数量

    我想计算假期 在Oracle中查询给定日期范围内的星期六和星期日的数量 你可以使用行生成器技术首先生成给定范围的日期 然后仅计算周六和周日 例如 此查询将提供 2014 年 1 月 1 日至 2014 年 12 月 31 日期间星期六和星期
  • 如何使用 Google-Maps-for-Rails 将信息窗口自动显示为打开状态

    我想显示一张地图 其中为页面上的单个标记自动显示信息窗口框 就像http code google com apis maps documentation javascript examples map coordinates html 我尝
  • 通过Javascript调用C#函数(不使用Json)

    我在 JavaScript Mypage aspx 中有一个名为 callfunction 的函数 该函数应该调用 C 中的另一个函数 func Mypage aspx cs 像这样的事情 在我的页面 aspx 中 function cal
  • Python CSV 导入以及嵌套列表创建

    我试图简单地将 csv 导入到 Python 中 我读过很多文档 但我一生都不知道如何执行以下操作 CSV格式如下 NYC 22 55 BOSTON 39 22 我试图生成以下内容 NYC 22 55 BOSTON 39 22 以便我可以在
  • R 中的月环比客户保留率

    我正在尝试提出一种使用 39 万行的大型数据集计算逐月客户保留率的方法 基本上 我想知道一个月内在场的客户与上个月在场的客户的百分比 因此 如果上个月 客户 a b 和 c 购买了一种产品 本月 客户 b c 和 d 进行了购买 上个月的三
  • 如何与pipenv共享虚拟环境?

    Pipenv 虚拟环境 venv 将与子文件夹共享 例如 如果您安装了venv in foo 它将可以在 foo baz 但如果你想分享相同的内容怎么办venv之间 foo bob and baz alice 以下对我有用 我希望它能有所帮
  • 对数据框中的数据列重新排序(删除/更改顺序)

    我有两个大型数据集 并且我正在尝试重新格式化旧数据集 以将问题按照与新数据集相同的顺序排列 这样我就可以轻松地对每个相同的问题执行 t 检验 以跟踪 2 个数据集的显着变化 数据集之间的年数 新版本在旧版本的基础上删除了一些问题 并增加了一
  • 在android sdk中的两个位置之间的地图中绘制线条时出现问题

    package com hands import java net HttpURLConnection import java net URL import javax xml parsers DocumentBuilder import
  • 在 JavaScript 中旋转数组中的元素

    我想知道旋转 JavaScript 数组最有效的方法是什么 我想出了这个解决方案 其中一个积极的n将数组向右旋转 负数n向左转 length lt n lt length Array prototype rotateRight functi
  • 使用 Python 对 PDF 文件进行文本挖掘?

    python 是否有一个包 库可以让我打开 PDF 并在文本中搜索某些单词 Using PyPdf2您可以使用提取文本 提取 pdf 文本并对其进行处理的方法 更新 更改了文本以引用 PyPdf2 感谢 Aditya Kumar 的提醒
  • 如何创建具有重复数据的 Jsoup.select.Elements?

    我有一个网页 table class table gradient table tbody tr td class time div 10 30 12 05 div td td class time div 12 30 14 05 div
  • 使用 填充多列的动态数组列表

    我正在尝试在多个表列上填充 ArrayList 这最初是在旧页面上使用 Scriptlet 完成的 但我知道这种做法现在不受欢迎 我在使用 struts 标签翻译它时遇到了麻烦 我希望桌子最终是这样的 Checkbox 1 Name 1 C
  • CustomAdapter 的 getView() 出现意外行为

    我有一个ViewHolder像这样的类 static class ViewHolder protected String fileName protected Bitmap bitmap null protected CheckBox ch
  • Silverlight 中的位图图像大小限制

    我正在制作一个 Windows Phone 7 应用程序 其中涉及从网络获取大图像并将其放入ScrollViewer供用户滚动浏览 我想我已经达到了限制BitmapImage不过 图像似乎在高度或宽度上被截断为 2048 像素 这是 Sil
  • iOS 查找平均速度

    我已经有一些东西可以显示我当前的速度和最高速度 下面代码中的最大速度 现在我想做一些东西来计算我的平均速度和核心位置 如何 谢谢 void locationUpdate CLLocation location speedLabel text
  • ActionScript 3 中的游戏逻辑和游戏循环

    我正在使用 flash actionscript 3 制作一个射击游戏 并且对逻辑流程以及如何巧妙地使用 OOP 概念有一些疑问 主要有3类 主类 初始化屏幕上的对象 敌人类别 用于在屏幕上移动敌人 子弹类别 用于射击 我想做的是查明敌人是
  • 为什么模板化右值引用接受左值?

    我看到类似的用法 include