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

使用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;
}
最佳答案
该标准实际上要求它需要捕获变量,而不是它所指的变量.这是标准中的一个错误,也是C中唯一可能发生这种情况的情况.

有一个defect report and suggested resolution(感谢@ t.c.)改变它以捕获所提到的eintity.

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

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

转载注明原文:使用C lambdas,通过引用捕获引用的规则是什么? - 代码日志