Lambda 按值捕获强制所有作用域对象为 const

2024-03-23

我打算用 C++ 编写一个记忆模式,最后采用了以下方法

std::function<int(int)> Memoize(std::function<int(int)> fn)
    {
        std::map<int, int> memo;
        std::function<int(int)> helper = [=](int pos) 
        {
            if (memo.count(pos) == 0)
            {
                memo[pos] = fn(pos);
            }
            return memo[pos];
        };
        return helper;
    }

奇怪的是,我的编译器VS 2012,拒绝编译并出现以下错误

1>Source1.cpp(24): error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)

在我看来,编译器故意将所有内容按值捕获为 const 对象。我找不到任何对此行为的记录参考。

任何人都可以帮助我了解这里可能发生的情况吗?


Lambda 的行为或多或少类似于函数对象;像函数对象一样,它们有一个函数调用运算符,即operator()。对于非mutablelambdas,这个函数是const:

[表达式.prim.lambda]

5 非泛型 lambda 表达式的闭包类型具有公共 内联函数调用运算符 [...]该函数调用运算符或 声明了运算符模板const(9.3.1) 当且仅当 lambda 表达式的参数声明子句是没有跟随mutable.

因为复制捕获的实体的行为就像 lambda 的成员变量一样:

15 [...] 对于复制捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。

and non-mutable会员cannot在a内修改const成员函数([class.this] / 1,[dcl.type.cv] / 4),如果你想修改捕获的实体,你必须声明一个mutable lambda.

目前你的 lambda 看起来像这样:

class Helper
{
public:
    int operator()(int) const;
private:
    std::map<int, int> memo;
    std::function<int(int)> fn;
};

你可以想一个mutablelambda 具有非const operator(),在您的情况下,lambda 可以定义如下:

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

Lambda 按值捕获强制所有作用域对象为 const 的相关文章

  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 使用 apache2 全新安装后 phpMyAdmin 无法工作

    当我尝试访问 phpmyadmin 页面时 我收到以下错误
  • 从 C# 向进程发送 CTRL_C/SIGINT

    我想中断通过 cmd exe 运行的命令 在下面的代码中 我使用 ping www stackoverflow com t 作为示例 public void Run System Diagnostics ProcessStartInfo s
  • 雪豹上的 Java5

    我需要 Java 5 不是 6 但 Snow Leopard 仅附带 Java 6 有 System Library Frameworks JavaVM framework Versions 1 5 但这仅仅指向1 6 0 ls la Sy
  • Numpy 字符串编码

    numpy 模块是一个出色的工具 可以有效地存储 Python 对象 其中包括字符串 对于 numpy 数组中的 ANSI 字符串 每个字符仅使用 1 个字节 然而 有一个不便之处 存储对象的类型不再是string but bytes 这意
  • 如何找到模板函数接受的参数数量?

    我有以下类型特征 template
  • nHibernate 和 sqlite 映射

    我在使用 sqlite 设置 nHibernate 时遇到了真正的问题 这是 hibernate cfg xml 文件
  • python中socket编程的疑惑

    我遇到了麻烦并且有很多关于套接字编程的问题 下面附上代码 所有部分均取自并写在一起 我正在尝试将鼠标数据发送到客户端 但是出现错误 Traceback most recent call last File srvr py line 29 i
  • 以多选形式显示先前选择的选项(rails)

    我已经构建了一个多选表单 从 form for 中 如下所示 div class rounded block quarter wide radio group h4 Exclude customers from source h4 div
  • 匹配除字母之外的任何内容 - 正则表达式

    如何匹配除字母以外的任何内容 我想 a z 会做但不是真的 我有这个字符串要搜索 price 7 99 opt 1 1 01 1 02 mixedId 0 price 8 99 opt 3 1 03 4 1 04 1 05 我想得到这些值8
  • django 通道 websocket 连接不工作

    我正在尝试从服务器上的 django Channels examples 运行多聊天项目 它可以在 Windows 计算机上本地运行 但是当我将其放在 Linux 服务器上并使用 runserver 启动它时 它不会 manage py r
  • C# 浮点精度

    谁能向我解释一下这里发生了什么 using System using System Text namespace ConsoleApplication1 class Program static void Main string args
  • Excel 2016 中的 VBA - 在代码中设置打印机设置

    我已经在互联网上搜索过 但找不到确切的解决方案 我需要能够从我的 VBA 代码中设置用于打印的颜色和双面设置 我的目的是使用 VBA 用户窗体按钮来格式化并打印工作簿中的表格 我的缩写代码是 Application PrintCommuni
  • 最佳实践(jQuery、CSS):如何初始化将切换可见的隐藏元素?

    堆栈警告我这是一个主观问题 并且可能很接近 但无论如何我都会尝试这个 我有一组控制按钮附加到图库中的图片 这些最初是隐藏的 当鼠标悬停在图像上时切换可见 我的问题是这样的 这些按钮应该在样式表中设置为隐藏 还是保持可见并在加载时由 jQue
  • 启动 mongod.exe 时,出现缺少 api-ms-win-crt-runtime-l1-1-0.dll 的错误

    在 Windows 7 上启动 mongod exe 时出现错误 程序无法启动 因为您的计算机缺少 api ms win crt runtime l1 1 0 dll 尝试重新安装该程序来解决此问题 安装了VC net框架和vc redis
  • tf.transpose 是否也会更改内存(如 np.ascontigouslyarray )?

    如果我使用tf transpose它也会改变内存布局吗 在 numpy 中 它使用函数np ascontiguousarray 我的意思是 如果我使用 cuda 这将很重要 因为内存布局是 N C H W 或 N H W C 会有所不同 N
  • 从推送通知中获取错误

    在我的应用程序中 我需要推送通知 我正在实施推送通知文档中的所有说明 但我从推送通知中收到错误 Fail To Register For Remote Notifications With Error Error Domain NSCoco
  • 使用异步套接字服务器的优点

    在什么情况下我们应该使用异步套接字 Tcp 或 Udp 服务器而不是同步套接字服务器 如果是在客户端 我知道我们曾经使用异步 这样它就不会阻塞 UI 线程 但我不确定为什么我们需要在服务器端使用异步 在服务器端 允许客户端并行处理非常重要
  • 对于这个实体层次结构来说,什么是好的持久性设计?

    我是 JPA 新手 正在尝试制定以下课程的设计 所有类都重写了 equals 和 hashcode getter 和 setter 以及空构造函数 我有一个所有实体的基类 public abstract class BaseEntity p
  • 合并后提交 ID 是否保持不变?

    我的团队使用 git 和 Bitbucket 进行版本控制 我之前创建了一个从我的存储库的分支之一到团队主存储库的分支之一的拉取请求 这个拉取请求被接受 我的分支被合并 昨天 我对存储库中的同一分支添加了一些更改 当我尝试向团队存储库上的同
  • Lambda 按值捕获强制所有作用域对象为 const

    我打算用 C 编写一个记忆模式 最后采用了以下方法 std function