【问题标题】:With C++ lambdas, what are the rules for capturing references by reference?使用 C++ lambdas,通过引用捕获引用的规则是什么?
【发布时间】:2016-04-22 11:22:07
【问题描述】:

对于 C++ lambda,当您通过引用捕获引用时会发生什么? 您是在捕获对堆栈上的本地对象的引用(引用本身),还是对被引用对象的引用? 比如下面的代码:

int& TestClass::returnReference()
{
        static int i=0;
        return i;
}

std::function<void ()> TestClass::testFunction()
{
        int& memberRef = this->someIntMember;
        int& intRef = returnReference();

        auto lambda =
        [&]
        {
                // What happens when you capture a reference by reference
                // like memberRef or intRef?
        };

        return lambda;
}

【问题讨论】:

标签: c++ lambda reference


【解决方案1】:

标准实际上要求它需要捕获变量,而不是它所指的内容。这是标准中的一个错误,也是 C++ 中唯一可能发生这种事情的情况。

有一个defect report and suggested resolution(感谢@t.c.)将其更改为捕获所引用的实体。

理论上,有一种低成本的引用捕获技术可以捕获堆栈指针并使用在 lambda 声明时已知的偏移量(可能加上 this),这将使用我们只需要通过以下方式捕获引用的事实变量不是内容。但是,我所知道的编译器都没有使用它,并且缺陷报告暗示不能以这种方式处理您不能别名为局部变量/全局变量的引用。

简而言之,标准说错了,但没有实际问题,因为没有编译器遵循标准的字母,而是做了正确的事。并且未来的编译器必须违反建议的缺陷解决方案才能产生不良行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多