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 的相关文章

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 为什么这个函数指针赋值在直接赋值时有效,但在使用条件运算符时无效?

    本示例未使用 include 在 MacOS10 14 Eclipse IDE 上编译 使用 g 选项 O0 g3 Wall c fmessage length 0 假设这个变量声明 int fun int 这无法通过 std touppe
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取

随机推荐

  • 使用 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