如果返回,lambda 运行 会超出范围吗
Will lambda run out of scope if returned
我有一个将函数或可调用对象作为输入的结构:
struct House {
std::function<int()> colorSelector;
}
现在我这样赋值:
House getHouse() {
House h;
int color = 10;
h.colorSelector = [&]() {
return color;
}
return h;
}
我 运行 会涉及范围界定问题吗?如getHousereturns后,color(局部变量)会被销毁?
Will I run into scoping issue?
是的。
您的 lambda 通过引用捕获 color
,在 getHouse
returns 之后,堆栈展开,进一步访问 color
是未定义的行为。
您应该按值捕获 color
以避免此类问题。
h.colorSelector = [color]() {
return color;
}
如果您需要引用同一个 color
,也许您想在某处分配一个 std::shared_ptr<color>
,然后捕获它的副本。
我有一个将函数或可调用对象作为输入的结构:
struct House {
std::function<int()> colorSelector;
}
现在我这样赋值:
House getHouse() {
House h;
int color = 10;
h.colorSelector = [&]() {
return color;
}
return h;
}
我 运行 会涉及范围界定问题吗?如getHousereturns后,color(局部变量)会被销毁?
Will I run into scoping issue?
是的。
您的 lambda 通过引用捕获 color
,在 getHouse
returns 之后,堆栈展开,进一步访问 color
是未定义的行为。
您应该按值捕获 color
以避免此类问题。
h.colorSelector = [color]() {
return color;
}
如果您需要引用同一个 color
,也许您想在某处分配一个 std::shared_ptr<color>
,然后捕获它的副本。