使用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;
}
答案 0 :(得分:6)
标准实际上要求它需要捕获变量,而不是它所指的变量。这是标准中的一个错误,也是C ++中唯一可能发生这种情况的情况。
有一个defect report and suggested resolution(感谢@ t.c。)改变了它以捕捉所提到的精神。
理论上,有一种低成本的参考捕获技术可以捕获堆栈指针,并使用lambda声明中已知的偏移量(加上可能this
),这些偏移量将使用我们只需要捕获的事实变量引用而不是内容。但是我知道没有编译器使用过它,缺陷报告暗示你不能将这些引用转换为locals / globals不能用这种方法处理。
简而言之,标准说错了,但没有实际问题,因为没有编译器遵循标准的字母,而是做了正确的事情。未来的编译器必须违反建议的缺陷解决方案才能产生不良行为。