当前位置: 首页 > 知识库问答 >
问题:

为什么我不能通过引用('

符懿轩
2023-03-14

我了解在lambda中捕获此(修改对象属性)的正确方法如下:

auto f = [this] () { /* ... */ };

但我对我所看到的以下特点感到好奇:

class C {
    public:
        void foo() {
            // auto f = [] () { // this not captured
            auto f = [&] () { // why does this work?
            // auto f = [&this] () { // Expected ',' before 'this'
            // auto f = [this] () { // works as expected
                x = 5;
            };
            f();
        }

    private:
        int x;
};

我感到困惑(并希望得到回答)的奇怪之处在于,为什么以下方法有效:

auto f = [&] () { /* ... */ }; // capture everything by reference

以及为什么我无法通过引用明确捕获此内容:

auto f = [&this] () { /* ... */ }; // a compiler error as seen above.

共有2个答案

糜淇
2023-03-14
匿名用户

因为标准没有

N4713 8.4.5.2捕获:

lambda-capture:
    capture-default
    capture-list
    capture-default, capture-list

capture-default:
    &
    =
capture-list:
    capture...opt
    capture-list, capture...opt
capture:
    simple-capture
    init-capture
simple-capture:
    identifier
    &identifier
    this
    * this
init-capture:
    identifier initializer
    &identifier initializer

出于lambda捕获的目的,表达式可能引用本地实体,如下所示:

7.3这个表达式可能引用*this。

因此,标准保证此和*此有效,且

姚海
2023-03-14

原因<代码>[

capture:
    identifier
    & identifier
    this

您可以看到

要明确捕获此,可以将此用作lambda导入器。

第一个捕获可以是默认的捕获,即:

capture-default:
    &
    =

这意味着通过引用自动捕获我使用的任何内容(

5.1.2.7/8:

为了查找名称(3.4),确定此(9.3.2)的类型和值,并使用(*此)将引用非静态类成员的id表达式转换为类成员访问表达式(9.3.1),在LAMBDA表达式的上下文中考虑[LAMBDA的]复合语句。

因此,在使用成员名称时,lambda的行为就好像它是封闭成员函数的一部分(例如在您的示例中使用名称x),因此它将生成this的“隐式用法”就像成员函数一样。

如果lambda捕获包含一个捕获默认值,即

因此,您可以使用[

但是<代码>[

 类似资料:
  • 我正在看这个leetcode挑战: 我的代码不能通过以下测试用例: 您的输入: 输出: 预期:

  • 我可以使用SQLDeveloper连接到远程数据库。 我试图从命令行使用sqlcl连接到同一个数据库,但我收到一个错误。 下面是我正在运行的命令: 我也尝试过: 以下是我收到的错误: 同样在SQLDeveloper中,我只是在“自定义jdbc url”下输入以下内容,它连接没有任何问题,所以我希望我可以使用相同的URL通过命令行连接,但到目前为止,它不起作用:

  • 问题内容: 我无法通过Java API连接到原始ElasticSearch集群。 复制: 结果: 结果: 因此,一切都可以通过HTTP运行。通过Java尝试(每个页面): 我得到以下堆栈跟踪: 与最接近的事我发现,到目前为止,这个问题是在这里,但线程落后了,但未得到解决。 问题答案: TransportClient的默认端口为9300。您必须在Java代码中使用它而不是9200。这可能是连接失败的

  • 我想通过数组映射,但我得到一个错误:TypeError: locationAddress.map不是一个函数 我是新来的反应和反应钩。我一直试图简化数组,但运气不好。知道为什么这不起作用吗? 编辑:到目前为止,我尝试了答案中的所有更改,但错误仍然存在。我包括了更多的代码和包。json文件。我尝试停用一些函数,如useEffect,现在只有在我尝试键入要映射的输入字段时才会显示错误。 找到解决方案:

  • 我无法通过Java API连接到vanilla ElasticSearch集群。 复制: 我得到以下堆栈跟踪: 到目前为止,我发现的最接近这个问题的东西是这里,但线程拖尾没有解决。

  • 我认为1534236469超出范围!Leetcode:7。反向整数我无法通过测试输入1534236469。为什么?返回范围为[Integer.MAX_VALUE,Integer.MIN_VALUE],其他应返回零 谢谢你的帮助