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

时间:2016-04-22 11:22:07

标签: c++ lambda reference

使用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;
}

1 个答案:

答案 0 :(得分:6)

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

有一个defect report and suggested resolution(感谢@ t.c。)改变了它以捕捉所提到的精神。

理论上,有一种低成本的参考捕获技术可以捕获堆栈指针,并使用lambda声明中已知的偏移量(加上可能this),这些偏移量将使用我们只需要捕获的事实变量引用而不是内容。但是我知道没有编译器使用过它,缺陷报告暗示你不能将这些引用转换为locals / globals不能用这种方法处理。

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