使用 std::function 移动语义

2024-01-01

std::function从右值引用提供构造函数。 按照标准,移动的函数对象会发生什么?会不会是空的,这样再次调用就没有效果了?


这个问题有太多的混乱。我会尽力把事情说清楚......

本节描述 std 定义对象的移出状态:

17.6.5.15 [lib.types.movedfrom]

C++ 标准库中定义的类型的对象可以从 (12.8)。移动操作可以显式指定或隐式指定 生成的。除非另有规定,此类移出的物体应 被置于有效但未指定的状态。

这是什么意思?这意味着,给定一个标准定义的移出对象,您可以对该对象执行任何操作,而无需先验了解该对象的状态。不需要先验了解当前状态的动作类别是没有先决条件的动作。

例如你可以打电话clear()在搬离vector因为没有任何先决条件vector::clear()。但你不能打电话pop_back()因为那确实是有前提的。

具体查看调用运算符function:

20.8.11.2.4 [func.wrap.func.inv]

R operator()(ArgTypes... args) const

效果: INVOKE(f, std::forward(args)..., R) (20.8.2),其中 f 是 *this 的目标对象(20.8.1)。

返回:如果 R 为 void,则无任何内容,否则为 INVOKE 的返回值 (f, std::forward( args)..., R)。

抛出: bad_function_call if !*this;否则,抛出任何异常 通过包装的可调用对象。

请注意,没有前提条件或 Requires 子句。这意味着调用呼叫操作员function搬离的function不是未定义的行为。无论处于何种状态function是,您不会因此调用而违反任何先决条件。

请注意,规范在任何情况下都不会说该调用不会产生任何效果。所以没有效果是不可能的。

该调用将调用包装的函数,或者抛出一个bad_function_call。这是唯一的两个选择。它的行为取决于function目的。和状态function对象未指定([lib.types.movedfrom])。

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

使用 std::function 移动语义 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • h5py:如何读取 hdf5 文件的选定行?

    是否可以从 hdf5 文件中读取给定的行集而不加载整个文件 我有相当大的 hdf5 文件 其中包含大量数据集 下面是我想要减少时间和内存使用的示例 usr bin env python import numpy as np import h
  • numpy 中的 FFT 与 MATLAB 中的 FFT 没有相同的结果

    我有一个带有复数的向量 可以找到here https www dropbox com s ve0de4ebk41s8y2 data txt dl 1 无论是在 Python 中还是在 MATLAB 中 我正在计算ifft 转化为 ifft
  • 抽象/虚拟方法的通用返回类型

    我有两个基类之间的关系 public abstract class RecruiterBase
  • 是否可以在 Core Data 中将 NSManagedObjects 返回为只读?

    我正在使用 Core Data 来缓存我正在编写的模块中的服务器数据 并且希望能够强制应用程序的其他部分不修改该数据 是否可以将我的 NSManagedObject 实例或用于获取它们的 NSManagedObjectContext 标记为
  • Rails 测试数据库在运行几次后未清除

    我正在使用 rspec 进行测试 我注意到运行测试后 它有时会在测试数据库中留下一些记录 我不知道为什么 我在配置文件中将 use transactional fixtures 设置为 true 但除非我手动删除记录 否则它们不会消失 有人
  • numpy 中的精度:比较数字时的问题

    首先介绍一下背景 我正在查找实数对称矩阵的特征值和特征向量 其中行总和为 0 更具体地说 一旦找到特征向量 我就会使用 argsort 来查找对特征值之一进行排序的排列 并将排列应用于原始矩阵 现在 我使用 numpy 包在 python
  • 为什么 @JsonProperty 不适用于 Kotlin 中的驼峰式属性

    有一个非常简单的类 class Price JsonProperty YPRICE val yprice String null JsonProperty ZPRICE val zPrice String null 以及将以下代码序列化为字
  • 异步任务 android onPostExecute

    在我的 Android 应用程序中 我使用 AsyncTask 从互联网下载图像 我传递了 url 然后我的 AsyncTask 进行下载 但是我如何将位图返回到我的活动中 目前 我将回调函数传递给 asynctask 构造函数 并在 On
  • 替换成有一个where子句吗?

    我正在编写一个应用程序 并使用 MySQL 作为 DBMS 我们正在下载房产报价 但存在一些性能问题 旧的架构看起来像这样 属性已更新 如果受影响的行数不为 1 则更新不被视为成功 否则更新查询解决了我们的问题 如果更新不成功 并且受影响的
  • 使用 HttpClient 检查互联网连接

    我很难理解以下代码如何处理偶尔的互联网连接丢失 理想情况下 我想在连接丢失后暂停应用程序 并在连接再次启动时恢复 有关于如何操作的指南吗 HttpClientHandler clientHandler new HttpClientHandl
  • 平衡绳的串联复杂度是多少?

    我查看了不同的论文 以下是我收集的信息 SGI实施 http www sgi com tech stl ropeimpl html and C cords http www cs ubc ca local reading proceedin
  • 不寻常的范围解析运算符

    今天重构一些 C 代码时 我得到了一些代码 可归结为以下内容 class x public void x y 是否x 范围解析运算符在这里做任何事情 这是一个错误 还是其他什么 我最好的猜测是 它是一些自动完成功能留下的人工制品 但我很想知
  • 从文件系统或 URL 解析 iPhone 的 Objective-C 中的 m3u 文件

    下面的示例应从 m3u 播放列表获取链接并将其添加到 anArray 所以我会得到NSArray NSMutableArray 其中包含某些链接 NSString fileContents NSString stringWithConten
  • 使用 JavaScript 三角法缩放旋转图像以填充 HTML5 Canvas?

    下面是我当前正在使用的代码 和0旋转 图像正确缩放以填充画布 如同background size cover 除了在 Canvas 上使用 JavaScript 我正在尝试添加旋转功能 具有以下功能 旋转时保持图像居中 我尝试使用width
  • 1318 - PROCEDURE 的参数数量不正确

    DROP PROCEDURE ModificarUsuario CREATE DEFINER root localhost PROCEDURE ModificarUsuario IN Aid INT IN Aced VARCHAR 100
  • 如何获取启动时运行的 CHKDSK 结果?

    有问题的 CHKDSK当我的机器重新启动时运行 并显示一些内容 问题是我不知道它显示了什么 因为它随后继续 完成后重新启动机器 我怎样才能让它停下来 暂停一下还是让我看看它做了什么 chkdsk 无法运行 因为该卷正在被另一个进程使用 CH
  • 如何从 pyodbc 结果行创建逗号分隔的字符串?

    我有一个存储在cursor rows 中的行结果集 这些行是从pyodbc cursor execute 命令返回的 解压这些数据并将其放入逗号分隔字符串列表 或解压到自定义对象中 的最快方法是什么 目前我正在做以下事情 cursor ex
  • 如何使用 Google Sheets API 添加超链接?

    我正在尝试编写一个 python 脚本来添加超链接到谷歌工作表 我正在为此使用谷歌API 通过搜索 我发现我需要向其余 api 传递 HYPERLINK 类型的消息 来自文档 https developers google com shee
  • 如何检查单选按钮

    我有以下 MySQL 表 id Title Windows Linux IDE GUI RAD 1 Software 1 1 0 1 0 0 2 Software 2 0 1 0 1 0 我想通过查询 mySQL 数据库来填充表单 到目前为
  • 使用 std::function 移动语义

    std function从右值引用提供构造函数 按照标准 移动的函数对象会发生什么 会不会是空的 这样再次调用就没有效果了 这个问题有太多的混乱 我会尽力把事情说清楚 本节描述 std 定义对象的移出状态 17 6 5 15 lib typ