自由函数的decltype错误

时间:2017-11-10 09:45:07

标签: c++

我正在玩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
                       ^~~

Wandbox网址:https://wandbox.org/permlink/E7BbGlyQD8FcHr5j

2 个答案:

答案 0 :(得分:2)

decltype(fun)返回函数类型,而不是fn ptr类型。你不能指定&#39;一个函数,只有一个函数ptr。如果你想包装一个自由函数,你有以下选择:

  1. 采取功能ptr
  2. 用lambda
  3. 包裹fun()调用
  4. 在std :: function&lt;&gt;中包装乐趣(注意:这是虚拟电话)

答案 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 ++意义上的函数。