#include <iostream>

void foo(int k) {
    static auto bar = [&]{
        std::cout << k << std::endl;
    };
    bar();
}

int main () {
    foo(1); foo(2); foo(3); // output is correct: 1, 2, 3
}

检查函数foo ,这是静态lambda如何通过引用捕获k 这似乎可行,并且对于更复杂的数据类型而不是int,也是如此

这是预期的吗? 是否可以保证每次foo调用时k的地址都相同,还是这个UB

在此先感谢您,如果在以前已经回答过此问题,对不起(我确实试图找到一个类似的问题但没有成功)

===============>>#1 票数:4 已采纳

这是未定义的行为

关于函数调用表达式及其参数初始化的C ++ 11标准第5.2.2 / 4段:

[...] 参数的生存期在定义它的函数返回时结束 每个参数的初始化和销毁​​都在调用函数的上下文中发生。 [...]

因此,您的lambda将存储一个引用,该引用将在函数调用返回时悬而未决。

在这种情况下,实现可以自由(而且很可能)在每个函数调用的相同地址处创建函数参数,这可能就是您观察预期输出的原因。

但是,此行为不是标准强制规定的-因此,您不应依赖它(如果是这种情况,则由于3.8 / 7,您的代码将是合法的)。

===============>>#2 票数:1

在您的示例中它可能“起作用”的原因是调用堆栈始终以相同的方式排列。 请尝试执行此操作,看看是否仍然获得“预期”输出。

#include <iostream>

void foo(int k) {
    static auto bar = [&]{
        std::cout << k << std::endl;
    };
    bar();
}

void baz(int k) {
    std::cout << "baz: ";
    foo(k);
}

int main () {
    foo(1); baz(2); foo(3);
}

  ask by José Manuel translate from so

未解决问题?本站智能推荐: