我正在使用以下代码。我有一个局部变量p
,我有一个lambda打印出它的地址:
int main()
{
int p = 0;
auto lambda = [&p] {
std::cout << &p << std::endl;
};
lambda(); // 0x7fff78e6b7e0
}
无论运行代码多少次,变量的地址都是相同的。但我发现当我将lambda定义更改为:
auto lambda = [&p]() {
// ^^
当我添加一个空参数列表时,我得到一个新地址:
lambda(); // 0x7fff2291a260
您可以测试over here。为什么会这样?我在Windows上运行g ++ - 4.8和clang ++上的代码。
答案 0 :(得分:4)
地址变更绝对可以。编译器可能会为您的lambdas生成不同的代码。操作系统可能会在不同的基址加载您的程序。
无论是否指定参数列表,您都可以确保变量地址相同:
#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
}