std::bind 如何按值获取可变参数,即使具有通用引用?

2024-01-03

函数签名为std::bind() 如下 https://en.cppreference.com/w/cpp/utility/functional/bind:

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );

So args如果我理解正确的话,是一个可变参数模板通用参考。传统通用引用的模板类型推导规则如下:

  1. 如果传递给 T 的参数是左值,则 T 被推导为左值引用
  2. 如果传递给 T 的参数是右值,则 T 被推导为左值

...我认为这些规则适用于中的每个参数args单独地,这意味着所有左值都传递到std::bind()作为函子的参数将通过引用传递。但这与下面的程序相矛盾:

#include <iostream>
#include <functional>

void function(int& n) {
  n++;
}

int main() {
    int n = 0;
    auto functor = std::bind(function, n);
    functor();
    std::cout << n << std::endl; // 0, not 1.
    return 0;
}

为了得到n要通过引用传递,您必须通过显式执行此操作std::ref(n),鉴于我对通用引用和完美转发知之甚少,这确实让我感到困惑。如何std::bind()当它使用通用引用时按值获取任何内容,否则会消耗左值作为引用?


它与签名几乎无关,它是一种设计选择。std::bind当然必须以某种方式存储其所有绑定参数并将它们存储为值。 “通用性”仅用于正确构建它们 - 通过移动或复制。

std::ref也是按值存储,但由于其性质,包装的对象是按引用“存储”的。

std::thread具有完全相同的行为。有人可能会说,(移动)默认构造一个副本更安全,因为返回的两个对象往往比最有可能被捕获的本地对象寿命更长。

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

std::bind 如何按值获取可变参数,即使具有通用引用? 的相关文章

  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • TCP客户端;网络流;异步读取; C#

    请原谅我对任务和异步缺乏了解 使用 TcpClient 类 我正在创建与可用服务器的连接 void async RunClientAsync TcpClient client new TcpClient try await client C
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 加载配置文件时发生错误:访问路径 c:\Program Files (x86)\... 被拒绝

    我有一个在 Windows 7 上使用 Visual Studio 2010 中的安装程序部署的应用程序 该程序在 Windows 7 和 XP 上部署并运行良好 但当我在 Windows 8 系统上部署它时 出现有关访问配置文件的错误 该
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 仅最后一个用户控件显示内容控件

    我有一个奇怪的问题 我创建了一个带有标签和画布的用户控件 画布引用资源 但画布仅显示在我的堆栈面板中的最后一个控件上 这是我的窗户
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • 在运行时将项目添加到 ToolStrip

    您好 我有一个带有 收藏夹 菜单的 ToolStripMenu 我想在运行时在 WinForms 应用程序中添加子项目 我有一个 datagridview 右键单击它会显示一个包含 添加到收藏夹 选项的上下文菜单 当该事件被触发时 我想使用
  • 具有两个表的谓词构建器

    A Party可以有一个或多个Contact对象 我想选择全部Parties谁的街道名称包含特定关键字 如果我只想搜索Party我可以使用下面的代码 但我如何扩展它来搜索Contact public IQueryable
  • 使用 /clr 或 clr:pure(cpprestsdk 又名 casablanca)编译时不支持互斥

    我创建一个CLR project in visual c with 64 bit配置 并尝试使用cpprestsdk aka casablanca 64bit 但是当我运行项目时 出现了错误 1 gt Build started Proje
  • 如何使用 __m128i 执行元素左移?

    我发现 SSE 移位指令只能在所有元素上移位相同的量 mm sll epi32 mm slli epi32 这些会移动所有元素 但移动量相同 http software intel com sites products documentat

随机推荐

  • 如何正确使用 axios params 和数组

    如何向查询字符串中的数组添加索引 我尝试像这样发送数据 axios get myController myAction params storeIds 1 2 3 我得到了这个网址 http localhost api myControll
  • JavaScript:获取数组中的平均对象?

    我试图想出一种方法来使代码变得简单 使用最少的循环和变量 但我遇到了麻烦 我想根据 值 获取数组 数字 中的平均对象 我觉得必须有一种数学方法来获得平均值 而无需在另一个循环中找到最接近的平均值 目前我有这个混乱 var numbers v
  • 无法在 Jenkins Pipeline 中显示 JUnit 测试结果

    我有一段 Jenkins 管道代码 我试图在我的角度代码上运行 JUnit 如果单元测试失败 Jenkins 必须停止管道 它正在工作 只是我看不到 最新测试结果 和 测试结果趋势 我正在使用 Jenkins 2 19 1 Jenkins
  • 导入 CSV 时选择指定行

    我有一个很大的 CSV 文件 我只想导入选择某些行 如果有 首先 我创建将导入的行的索引 然后我希望将这些行的名称传递给 sqldf 并返回指定行的完整记录 create the random rows ids that will be s
  • 安卓Mipmap?

    每当我尝试使用 AndroidStudio 生成新的 Android 项目时 它都会隐藏文件夹 drawables 我以前从未发生过这种情况 我环顾四周 发现它正在生成这个名为 mipmap 的文件夹 我搜索了一下 发现这与绘图类似 但这是
  • 尝试使用 woocommerce_new_order_item 挂钩保存订单项元数据

    Add meta to order item param int item id param array values return void function cart add meta data booking item id valu
  • 使用 Wikimedia API 获取位置

    如何使用 Mediawiki API 获取 Wikipedia 文章的城市 国家位置 假设我想确定圣家族大教堂位于哪个国家 哪个城市 我应该使用什么属性 尝试以下查询 And see 扩展 地理数据 https www mediawiki
  • React Router v4 中的嵌套路由

    我正在尝试设置一些嵌套路由来添加通用布局 检查一下代码
  • 在应用程序购买测试帐户无法在 IOS 中运行?

    我们正在使用沙盒测试帐户测试应用程序购买 在测试时它显示验证 在验证付款信息后 当我尝试在应用程序购买中测试时 它会将我重定向到应用程序商店 应用程序商店显示超时 我做错了什么吗 我还创建了另外三个沙箱测试帐户 用于在应用程序购买中进行测试
  • Parallel.ForEach 未生成所有线程

    我在使用 Parallel ForEach 时遇到一些问题 我需要模拟几个硬件组件 等待传入连接并回复它 我当前的代码如下 Task Factory StartNew gt components component gt var liste
  • 第 N 次和第 (N+1) 次出现之间的正则表达式字符串

    我试图找到两个特殊字符之间第 n 次出现的子字符串 例如 一 二 三 四 五 比如说 我正在寻找 第 n 次和第 n 1 次 第二次和第三次出现 之间的字符串字符 结果是 三 我想使用正则表达式来做到这一点 有人可以指导我吗 我当前的尝试如
  • 从 SQL Server 2008 调用非托管 C/C++ DLL 函数

    我有一个庞大的 C C 函数库 需要从 SQL Server 2008 调用 我编写了一个 C 适配器类 它从 Win32 DLL 加载这些函数DllImport并将它们暴露给 Net 代码 这在大多数 Net 应用程序中都可以正常工作 现
  • 如何将参数名称作为参数传递?

    我有这个代码 hobbies2 form cleaned data pop hobbies2 PersonneHobby objects filter personne obj delete for pk str in hobbies2 t
  • UpdateSourceTrigger=显式

    我正在创建一个包含多个文本框的 WPF 窗口 当用户按下 确定 按钮时 我希望所有文本框都被评估为非空白 我知道我必须将 TextBox 与 Explicit 的 UpdateSourceTrigger 一起使用 但我是否需要为每个文本框调
  • 在资源有限的环境中禁用背景视频

    对于基于网络的媒体播放器项目 我正在尝试使用简单的一些微妙的背景视频
  • 使用 asp.net WebService 和 Android 将图像上传到 Azure Blob 存储?

    我正在尝试通过以下方式将选定的图像从我的 Android 设备上传到 Azure Blob 我制作的 asp net WebService 但我在 android 中收到橙色错误 W System err 454 SoapFault 故障代
  • Windows 客户端应用程序的登录对话框

    我可以调用 Win32 函数来显示 Windows 登录对话框吗 例如 Internet Explorer 和 Visual Studio 的团队资源管理器在访问网站时都会显示凭据对话框 我如何显示该对话框 我有一个 NET Windows
  • CLion 和 Crypto++ 库

    不久前 我开始在 Visual Studio 2015 中编写应用程序 在设置所有库依赖项时没有出现任何问题 现在 我决定搬到 CLion 但是我的应用程序依赖于cryptopp库 我需要将其链接到我的 CLion 项目中 目前 我面临着大
  • 如何仅获取表达式系列输出的最后一个值?

    我不需要这个表达式的整个数组 只需要它的最近 当前 值 如何修改其代码 UpperBollinger ta sma close 20 2 ta stdev close 20 当然 我可以用它来获得相同的较低频段 你不能这样做 Once a
  • std::bind 如何按值获取可变参数,即使具有通用引用?

    函数签名为std bind 如下 https en cppreference com w cpp utility functional bind template lt class F class Args gt unspecified b