3

我有以下我正在玩的代码。我有一个局部变量p,我有一个打印出其地址的 lambda:

int main()
{
    int p = 0;
    auto lambda = [&p] {
        std::cout << &p << std::endl;
    };

    lambda(); // 0x7fff78e6b7e0
}

无论我运行多少次代码,变量的地址都是相同的。但是我发现当我将 lambda 定义更改为:

auto lambda = [&p]() {
//                ^^

这意味着当我添加一个空参数列表时,我会得到一个新地址:

lambda(); // 0x7fff2291a260

你可以在这里测试一下。为什么会这样?我在 Windows 上的 g++-4.8 和 clang++ 上运行我的代码。

4

1 回答 1

4

换地址绝对OK。编译器可能会为您的 lambda 生成不同的代码。操作系统可能会在不同的基地址加载您的程序。

无论是否指定参数列表,您都可以确保变量地址相同:

#include <iostream>

int main()
{
    int p = 0;
    auto lambda1 = [&p] {
        std::cout << &p << std::endl;
    };

    auto lambda2 = [&p] (){
        std::cout << &p << std::endl;
    };

    lambda1(); //0x7fffe3034fb4
    lambda2(); //0x7fffe3034fb4
}
于 2013-10-03T14:08:59.290 回答