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)
标准实际上要求它需要捕获变量,而不是它所指的变量.这是标准中的一个错误,也是C++中唯一可能发生这种情况的情况.
有一个缺陷报告和建议的解决方案(感谢@tc)改变了它以捕获引用的eintity.
从理论上讲,有一种低成本的参考捕获技术可以捕获堆栈指针,并使用在lambda声明(加上可能this)处已知的偏移量,这些偏移量将使用我们只需要通过变量而不是内容捕获引用的事实.但是,我所知道的编译器没有使用它,缺陷报告意味着不能以这种方式处理不能别名为locals/globals的引用.
简而言之,标准说错了,但没有实际问题,因为没有编译器遵循标准的字母,而是做了正确的事情.未来的编译器必须违反建议的缺陷解决方案才能产生不良行为.