对于 C++ lambda,通过引用捕获引用的规则是什么

With C++ lambdas, what are the rules for capturing references by reference?

本文关键字:引用 规则 是什么 C++ lambda 对于      更新时间:2023-10-16

使用 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++中唯一可能发生这种事情的情况。

有一个缺陷报告和建议的解决方案(感谢@t.c.)对其进行了更改以捕获引用的永恒性。

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

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