不允许从函数返回函数。我怎么能?

时间:2013-02-13 23:23:29

标签: c++ function function-pointers language-lawyer

8.3.5/8 Functions [dcl.fct]

  

[...] 函数的返回类型不应为   键入数组或函数,尽管它们可能具有类型指针的返回类型或对此类事物的引用。 [...]

为什么如此明确规则?是否有一些语法甚至允许返回函数而不是函数指针?

我错过了解释报价吗?

typedef void (*fp)();

void foo(){}
fp goo()
{
    return foo; //automatically converted to function pointer
}

3 个答案:

答案 0 :(得分:3)

这是一个试图返回函数的函数的一个非常人为的例子:

void foo() { }

template<typename T>
T f() { return foo; }

int main(){
    f<decltype(foo)>();
}

这是我从Clang 3.2得到的错误:

Compilation finished with errors:
source.cpp:7:5: error: no matching function for call to 'f'
    f<decltype(foo)>();
    ^~~~~~~~~~~~~~~~
source.cpp:4:3: note: candidate template ignored: substitution failure 
[with T = void ()]: function cannot return function type 'void ()'
T f() { return foo; }
~ ^
1 error generated.

答案 1 :(得分:1)

我知道这可能不会完全回答你的问题,但它会部分解决

你可以从另一个函数返回一个函数(这就是lambdas是什么)

std::function<int (int)> retLambda() {
    return [](int x) { return x; };
}

答案 2 :(得分:1)

  

是否有一些语法甚至允许返回函数而不是函数指针?

语法?当然有:

using fun = int (int);

fun function_that_returns_a_function();

由于§8.3.5/ 8中的规则禁止编译,因此无法编译。我不知道为什么规则具体存在 - 但考虑到类型“function”没有任何大小,所以你不能在C ++中创建函数类型的对象。