不允许从一个函数中返回另一个函数。我该怎么办?

6

8.3.5/8 Functions [dcl.fct]规定:

[...] 函数不得返回数组或函数类型,但可以返回指向此类事物的指针或引用类型。[...]

为什么要如此明确地规定?是否存在某种语法,即使与函数指针相比,也允许返回函数本身?

我是否误解了这句话?

typedef void (*fp)();

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

1
@B.Nadolson 这只算作一次无效的转换。 - Luchian Grigore
2
“自动转换为函数指针”,那么它就不是一个函数 ;) - mfontanini
3个回答

4
这是一个相当牵强的例子,演示了一个函数尝试返回一个函数:
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:没错。而且,这只是C++为我们提供明确和清晰的东西的罕见例子之一,而不是让我们从语法和其他各种规则(如不可复制性)中推导出来。赞美他! - Lightness Races in Orbit
@LightnessRacesinOrbit:确实如此。我经常觉得从标准中推导出一条规则就像证明一个数论定理。但这种情况并非如此。 - Andy Prowl
1
是的,有趣的是,当它确实发生时,它很少会引起一个惊慌失措的 OP 提出一个 SO 问题。 - Lightness Races in Orbit

2

是否有一些语法可以返回函数而不是函数指针?

有这样的语法吗?当然有:

using fun = int (int);

fun function_that_returns_a_function();

这段代码无法编译,因为§8.3.5/8规则禁止这样做。我不知道为什么会有这个规则 - 但请注意,“函数”类型没有任何大小,因此您不能在C++中创建函数类型的对象。


1
我知道这可能不能完全回答你的问题,但它在一定程度上解答了它。
你可以从另一个函数返回一个函数(这就是lambda函数)。
std::function<int (int)> retLambda() {
    return [](int x) { return x; };
}

2
从技术上讲,Lambda表达式并不是函数,而是函数对象的实例。 - Andy Prowl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接