【问题标题】:Does the standard specify whether a lambda capturing by value captures the parent object, or just the member being accessed?标准是否指定按值捕获的 lambda 是捕获父对象还是仅捕获正在访问的成员?
【发布时间】:2012-11-27 03:29:43
【问题描述】:

第一个例子:

struct State
{
    SomeLargeObjectThatTakesTimeToCopy obj;
    int x;
} myState;

auto f = [=]() { return myState.x * 2; };

整个myState 结构是否被复制,即使从技术上讲,只使用了x 成员?

第二个例子:

struct State
{
    struct SubState
    {
        int x;
    };

    std::vector<SubState> subStates;
} myState;

auto f = [=]() { return myState.subStates[0].x * 2; };

再次,整个myState 对象是否被复制?如果没有,那么整个subStates 成员会被复制吗?

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    假设myState 是一个局部变量(在函数体中定义),myState 将被捕获; lambda 只能捕获整个变量,而不是点点滴滴。

    如果您按原样处理示例,则不会捕获任何内容; lambda 无法捕获全局变量。

    【讨论】:

    • 那么编译器就没有优化的余地了吗?我希望简化上述示例相当容易。
    • 这并不像乍看起来那么容易;不允许编译器忽略所涉及的复制构造函数或析构函数的任何副作用。
    • 嗯。这是一个有趣的观点。这有点令人失望,但我想这也是一厢情愿。 :) 如果您手边有标准,我想知道它是哪个部分指定的。
    • 关于 lambdas 的部分说,为 lambda 生成的类必须具有与标准中指定的基本相同的成员,并且具有相同的效果。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2010-09-14
    • 2020-05-13
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多