在 C 11 Lambda 中通过引用捕获引用
问题:
考虑下面的代码片段:
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); }</code>
我们能保证这个程序会输出5而不会遇到未定义的行为吗?这个问题特别是在通过引用([&])捕获变量 x 时出现,并且涉及一旦函数 make_function 返回,捕获对变量的引用是否会导致悬空引用。
答案:
是的,代码保证可以工作。
说明:
C 11 lambda 规范表明只要最初引用的对象仍然存在,此处捕获的引用就保持有效。这意味着即使 make_function 中的参数 x 在函数返回后超出范围,lambda 闭包仍然保留对整数 i 的有效引用。
澄清:
为了解决之前回复中的一些不准确之处:
在这种特定情况下,变量x 位于 lambda 的可达范围内,并通过引用捕获。因此,引用仍然有效,并且 lambda 可以继续访问 i 的修改值。
结论:
此代码演示了如何正确捕获引用lambda 中的引用。保证输出 5 而不调用未定义的行为。
以上是在 C 11 Lambda 中通过引用捕获引用是否可以保证对修改值的访问?的详细内容。更多信息请关注PHP中文网其他相关文章!