gpt4 book ai didi

c++ - lambda 函数中的 Const 引用参数

转载 作者:行者123 更新时间:2023-12-01 14:23:06 24 4
gpt4 key购买 nike

#include <iostream>
#include <functional>

using Callback = std::function<void(const int)>;

int main() {
Callback testCall = [](const int &num) {
std::cout << "callback: " << num << " - " << &num << std::endl;
};
int num = 42;
testCall(num);
std::cout << "main: " << num << " - " << &num << std::endl;
}

可能的输出:

callback: 42 - 000000B19197F618
main: 42 - 000000B19197F694

如您所见,即使我分配了一个通过引用获取参数的 lambda 函数,它仍然使用一个拷贝。

对吗?

如果是,为什么它仍然可以编译?为什么至少没有关于 Callback 声明参数和分配的 lambda 之间差异的警告。 (const int &num vs const int num)

当不使用const 时,它不会编译。

附言。如果您找到更好的标题,请随时进行编辑。

最佳答案

这是因为 testCall 是一个仿函数对象,它通过复制捕获其参数,然后对其调用 lambda。

尝试:

Callback f = [](const int &num) {
std::cout << "callback: " << num << " - " << &num << std::endl;
};

int main() {
int num = 999;
std::cout << "callback: " << num << " - " << &num << std::endl;
f(num);
[](const int &num) {
std::cout << "callback: " << num << " - " << &num << std::endl;
}(num);
}

你会看到这样的东西:

callback: 999 - 0x7ffeed60a9bc
callback: 999 - 0x7ffeed60a994
callback: 999 - 0x7ffeed60a9bc

这意味着 callBack 本身不是函数,而是函数的间接寻址。并且关于类型没有问题......

对此的回答可能有助于您了解幕后发生的事情:How std::function works

关于c++ - lambda 函数中的 Const 引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60651112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com