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

Not allowed to return a function from a function. How could I?

提问人:Luchian Grigore 提问时间:2/14/2013 更新时间:2/14/2013 访问量:14480

问:

8.3.5/8 Functions [dcl.fct]

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

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

我是不是误读了这句话?

typedef void (*fp)();

void foo(){}
fp goo()
{
    return foo; //automatically converted to function pointer
}
C++ 函数 指针 语言律师

评论

1赞 Luchian Grigore 2/14/2013
@B.Nadolson,仅算作无效转换。
2赞 mfontanini 2/14/2013
“自动转换为功能指针”。那么它就不是一个函数;)

答:

1赞 Aniket Inge 2/14/2013 #1

我知道这可能不能完全回答你的问题,但它确实部分地回答了你的问题

您可以从另一个函数返回一个函数(这就是 lambda )

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

评论

2赞 Andy Prowl 2/14/2013
从技术上讲,lambda 不是函数,它们是函子的实例
2赞 Konrad Rudolph 2/14/2013 #2

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

语法?当然有:

using fun = int (int);

fun function_that_returns_a_function();

这不会编译,因为 §8.3.5/8 中的规则禁止它。我不知道为什么这个规则特别存在——但考虑到“函数”类型没有任何大小,所以你不能在 C++ 中创建函数类型的对象。

4赞 Andy Prowl 2/14/2013 #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.

评论

0赞 Lightness Races in Orbit 2/14/2013
+1:没错。此外,这只是 C++ 为我们清晰明确地提供内容的罕见实例之一,而不是让我们从语法和其他各种规则(例如不可复制性)中派生它。赞美他!
0赞 Andy Prowl 2/14/2013
@LightnessRacesinOrbit:确实如此。我常常觉得,从标准中推导出一条规则,就像证明一个数论定理。在这种情况下不行。
1赞 Lightness Races in Orbit 2/14/2013
是的;有趣的是,当它确实发生时,它很少会从惊慌失措的 OP 中实际生成 SO 问题。