我正在玩decltype并发现奇怪的事情。为什么在尝试对自由函数进行decltype时会出现此错误?它适用于lambdas,但不适用于自由功能。我在这做错了什么?
#include <iostream>
using namespace std;
int fun()
{
cout << "inside fun" << endl;
return 1;
}
int main()
{
decltype(fun()) x = 2;
cout << x << endl;
auto lambda = [] () -> int { cout << "inside lambda" << endl; return 3; };
decltype(lambda) l = lambda;
l();
decltype(fun) f = fun; // ERROR
f();
}
错误是:
prog.cc: In function 'int main()':
prog.cc:19:19: warning: declaration of 'int f()' has 'extern' and is initialized
decltype(fun) f = fun; // ERROR
^
prog.cc:19:23: error: function 'int f()' is initialized like a variable
decltype(fun) f = fun; // ERROR
^~~
答案 0 :(得分:2)
decltype(fun)返回函数类型,而不是fn ptr类型。你不能指定&#39;一个函数,只有一个函数ptr。如果你想包装一个自由函数,你有以下选择:
答案 1 :(得分:2)
在不使用decltype
的情况下,基本上是相同的错误:
#include <iostream>
using namespace std;
int fun()
{
cout << "inside fun" << endl;
return 1;
}
int main()
{
// was: decltype(fun()) x = 2;
int x = 2;
cout << x << endl;
auto lambda = [] () -> int { cout << "inside lambda" << endl; return 3; };
decltype(lambda) l = lambda;
l();
typedef int fn_type();
fn_type* f = fun; // no problem
fn_type g = fun; // ERROR
f();
}
您已将f
声明为类型int()
,即您正在尝试将该函数复制到新变量中,而C ++不支持该函数(函数不一流的对象)。允许创建一个函数指针,这可能是你想要的,并直接从fun
分配,它将自动被视为该上下文中的函数指针。
lambdas不会发生这种情况,因为它们隐含地声明了一个新类(通常意义上只是常规的class
)。它们与函数一样,因为它们有一个重载的operator()
方法,但它们实际上并不是传统C ++意义上的函数。