总是在lambda表达式中捕获所有内容是不好的做法?

xml*_*lmx 18 c++ performance lambda coding-style c++11

std::function<int()> void f1()
{
    int a, b, c, d, ..., x, y, z;

    return [=] { return a + b + c; };
}
Run Code Online (Sandbox Code Playgroud)

std::function<int()> void f2()
{
    int a, b, c, d, ..., x, y, z;

    return [a, b, c] { return a + b + c; };
}
Run Code Online (Sandbox Code Playgroud)

毋庸置疑,前者比后者更短,更方便,更优雅.

但是,我仍然担心:

从性能的角度来看,后者总是优于前者吗?

标准是否保证lambda表达式仅捕获必要的变量?即,在前一示例中,仅捕获a,b,c,未使用的变量d,...,x,y,z不是.

Jer*_*fin 26

该标准保证,如果执行默认捕获,那么将从周围环境捕获的默认捕获的唯一变量是您实际在lambda中使用的变量.

因此,指定要捕获的各个变量充当您期望使用的文档,但绝不应影响性能.

对于任何关心的人,标准中的确切措辞是(§5.1.2/ 11,12):

11如果lambda表达式具有关联的capture-default及其复合语句odr-uses(3.2)this或具有自动存储持续时间的变量且未明确捕获使用了odr的实体,则表示使用了odr的实体被隐含地捕获; 这些实体应在lambda表达式的范围内声明.[ 注意省略 ]

12如果明确或隐含地捕获实体,则捕获该实体.[...]

简介:隐式捕获规范([=][&])仅捕获lambda中使用的变量.