【问题标题】:How to make const some members of a mutable lambda capture list?如何使 const 可变 lambda 捕获列表的某些成员?
【发布时间】:2019-05-27 10:42:28
【问题描述】:

mutable lambda 可以更改其捕获列表成员的值(按值捕获)。有什么办法可以让捕获列表的某些成员在mutable lambda 中保留const

例如我想更改i,但在the following code samplelambda 的正文中有const j

#include <iostream>

int main()
{
    int i = 42;
    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };

    lambda();
}

【问题讨论】:

  • 是的。写一个结构体。
  • 您始终可以使用const 成员捕获课程:struct hasI { const int i; }。现在在可变 lambda 中按值捕获它,hasI.i 仍然是 const
  • @SamVarshavchik 嗯。有趣的解决方案。而且我可以使这个结构本地化并且不命名,所以这里不会有很多样板。你能写下你的评论作为答案吗?
  • @PasserBy 谢谢。

标签: c++ lambda constants mutable const-correctness


【解决方案1】:

由于简单捕获具有它们捕获的东西的精确、cv 限定类型,因此您可以创建外部变量 const 从而获得 const 捕获:

#include <iostream>

int main()
{
    const int i = 42;
//  ^^^^^

    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };

    lambda();
}

当然,如果您需要在某些时候修改外部变量,您需要先对其进行复制——或者以某种方式重构您的代码以使其更整洁。

【讨论】:

  • 谢谢。是的,我可能想修改它。
  • 真的不是拷贝初始化吗?所以不应该通过 cv 限定符。
  • @StoryTeller:你告诉我——你指的是哪条规则让你相信?
  • auto k = i; 中我们不会在k 中得到一个常量对象。如果我们使用初始化列表 i = as_const(i) i 也不会是 const,那么可以轻松尝试。我怀疑你得到的错误是因为i 实际上没有被捕获。它是一个常量表达式(你可以用它来定义一个数组)。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2016-06-14
  • 1970-01-01
  • 2013-10-31
  • 2015-10-07
相关资源
最近更新 更多