在以下人为设计的示例中,我有一个通用函数,该函数将任意lambda作为回调函数,检查一些前提条件,并在满足条件的情况下调用lambda:
template<ApplyF>
void check_valid(CharacterId id, Operation op, ApplyF apply)
{
auto it = characters_.find(id);
if (it != characters_.end())
{
Character& character = it->second;
if (character.operation_valid(op))
{
apply(character);
}
}
}
然后,这使我可以减少样板操作,仅在满足上述先决条件时才调用lambda:
void attack(CharacterId id, CharacterId enemy, double skill, double chance)
{
check_valid(id, Operation::Attack, [=](Character& character)
{
character.attack(enemy, skill, chance);
});
};
void harvest(CharacterId id, ResourceId resource, double quantity)
{
check_valid(id, Operation::Harvest, [=](Character& character)
{
character.harvest(resource, quantity);
});
};
您可以看到我正在按值捕获lambda中所需的变量。
我还按值将Lambda传递给check_valid
。
问题:
动态内存分配是我需要担心的吗?
捕获的变量并按值传递lambda会导致动态内存分配吗?
我知道lambda可以被内联,因此在这种用法中,优化者是否会认为捕获只是语言规则的副产品,并且在外部范围内引用变量而不复制任何内容?>