gpt4 book ai didi

c++ - 如何在 C++ 中声明对 lambda 的引用

转载 作者:行者123 更新时间:2023-12-01 14:44:39 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is auto as a parameter in a regular function a GCC 4.9 extension?

(2 个回答)


5年前关闭。




我想声明一个函数,该函数将具有特定原型(prototype)的函数(或 lambda)作为参数。

第一次尝试是:

#include <iostream>
using namespace std;
int test(int (&val)(int)) {
return val(2);
}
int main() {
cout << test([](int v){
return v+100;
});
return 0;
}

女巫结果 error: invalid initialization of non-const reference of type 'int (&)(int)' from an rvalue of type 'main()::<lambda(int)>'
我尝试将指定的 const 添加到类型中,但我不知 Prop 体在哪里,所以我尝试了以下适用于 GCC(-std=c++14)的方法,但是我怀疑它是非法的,因为它因 clang 而失败:
int test(const auto& val) {
return val(2);
}

我知道我可以使用模板或函数指针或 std::function 来实现相同的目的,那么请考虑这是一个教学问题。我想知道在上面的第二个示例( int test(const auto& val) )中,GCC 将 val 的类型推断为什么。
template <typename F>
int test(F val) {
return val(2);
}

int test(int val(int)) {
return val(2);
}

int test(std::function<int(int)> val) {
return val(2);
}

最佳答案

I want to declare a function that takes as argument a function (or lambda) with a specific prototype.



由 lambda 表达式生成的闭包具有唯一且匿名的类型。它们也可以是通用的(即模板 operator() )。没有“简单”的方式来声明一个接受具有特定原型(prototype)的 lambda 的函数。您最好的选择是使用带有 std::is_invocable 之类的受约束模板参数。或使用某种类型的删除,如 function_view .

注意:如果你的 lambda 是 无捕获 它可以隐式转换为函数指针。例如。
int test(int (*)(int)) { }

test([](int) -> int {}); // OK
test([i = 0](int) -> int {}); // compile-time error

I want to know what does GCC deduce the type of val to, in the second example.


int test(int val(int))

……相当于……
int test(int (*val)(int))

事实上,将它们放在同一范围内会导致重新定义错误:
int test(int val(int)) {
return val(2);
}

int test(int (*val)(int)) {
return val(2);
}
prog.cc:5:5: error: redefinition of 'test'
int test(int (*val)(int)) {
^
prog.cc:1:5: note: previous definition is here
int test(int val(int)) {
^

关于c++ - 如何在 C++ 中声明对 lambda 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539016/

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