对于 C++ lambda,通过引用捕获引用的规则是什么
With C++ lambdas, what are the rules for capturing references by 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;
}
该标准实际上要求它需要捕获变量,而不是它所指的内容。 这是标准中的一个错误,也是C++中唯一可能发生这种事情的情况。
有一个缺陷报告和建议的解决方案(感谢@t.c.)对其进行了更改以捕获引用的永恒性。
从理论上讲,有一种低成本的引用捕获技术可以捕获堆栈指针并使用在lambda声明点(可能加上this
)已知的偏移量,这将使用我们只需要通过变量而不是内容捕获引用的事实。 但是,据我所知,没有编译器使用它,并且缺陷报告暗示不能以这种方式处理不能将引用别名为局部/全局变量。
简而言之,标准说错了话,但没有实际问题,因为没有编译器遵循标准的文字,而是做了正确的事情。 未来的编译器必须违反建议的缺陷解决方案才能出现不良行为。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 对于 C++ lambda,通过引用捕获引用的规则是什么
- C++ mapnik 未定义对规则的引用
- 在C++中返回伪对象引用的规则
- C++ 构建警告:取消引用类型双关指针将违反严格锯齿规则
- 为什么我们需要引用折叠规则
- 取消引用类型的punned指针将打破严格的别名规则[-Wstrict aliasing]
- 取消引用类型punned指针将打破严格的混叠规则:将字节数组转换为数字
- 将char[]强制转换为usingned int给出:取消引用类型的punned指针将打破严格的别名规则
- 是否有一条规则或优先级可以选择值/指针/引用