gpt4 book ai didi

c++ - Lambda 捕获列表 : capturing object's member field by value not possible without capturing the whole object?

转载 作者:可可西里 更新时间:2023-11-01 16:34:29 31 4
gpt4 key购买 nike

下面的代码

void CMainWindow::someMethod(const CLocationsCollection& parentItem)
{
auto f = [this, parentItem.displayName](){};
}

给我一​​个错误:

error C2143: syntax error : missing ']' before '.'

如果我想通过 ref 捕获 parentItem.displayName,我会为它创建一个非依赖别名标识符:

const QString& name = parentItem.displayName;
auto f = [this, &name](){}; // Or should it be [this, name] ?

但是我需要按值来捕获它,我不想捕获整个 parentItem 因为它很重。有什么解决办法吗?

P. S. 捕获列表中的名称必须是标识符。 parentItem.displayName(作为一个整体)不是一个标识符吗?为什么不能被编译器正确解析?

最佳答案

Note: All standard references in this post are taken from the C++ Standard Draft n3337.


简介

标准规定捕获必须是&=this标识符,或以 & 开头的标识符

5.1.2 Lambda expressions [expr.prim.lambda]

capture-list:
capture ..._opt
capture-list , capture ..._opt

capture:
identifier
& identifier
this

因为 parentItem.displayName 不是标识符,而是“类成员访问表达式”。编译器在拒绝您的代码段时是正确的。

5.2.5p1 Class member access [expr.ref]

A postfix expression followed by a dot . or an arrow ->, optionally follow by the keyword template (14.2), and then followed by an id-expression, is a postfix expression. The postfix expression before the dot or arrow is evaluated;66 the result of that evaluation, together with the id-expression, determines the result of the entire postfix expression.


要是有一种方法可以用表达式来初始化捕获就好了...

C++14 中,您能够使用 init-capture 来规避手头的问题,就像代码片段一样以下。它将创建一个名为 display_name 的捕获,并使用 parentItem.displayName 的值进行初始化。

[display_name = parentItem.displayName](){ ... };

C++11 怎么样?

很遗憾,C++11 中没有这样的功能。因此,该问题的解决方案是对数据成员进行本地引用,然后在创建 lambda 时捕获该引用。

auto& lmb_display_name = parentItem.displayName;

[lmb_display_name](){ ... }; // the lambda will have a copy of `parentItem.displayName`


注意:您的原始帖子似乎暗示 lambda 捕获列表中的引用 R 的名称会使 lambda 包含对 R 所指的内容的引用,这是不正确的,如 this snippet 所示.

关于c++ - Lambda 捕获列表 : capturing object's member field by value not possible without capturing the whole object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24221061/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com