使用C++ lambdas,通过引用捕获引用的规则是什么?

Nic*_*vac 5 c++ lambda reference

使用C++ lambdas,当您通过引用捕获引用时会发生什么?您是在捕获对堆栈上的本地对象(引用本身)的引用,还是对引用的对象的引用?例如,在以下代码中:

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;
}
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 7

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

有一个缺陷报告和建议的解决方案(感谢@tc)改变了它以捕获引用的eintity.

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

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