8.3.5/8 Functions [dcl.fct]
说
[...]函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针或对此类事物的引用的返回类型。[...]
为什么这么明确的规则?是否有一些语法甚至允许返回一个函数而不是函数指针?
我是否误解了报价?
typedef void (*fp)();
void foo(){}
fp goo()
{
return foo; //automatically converted to function pointer
}
8.3.5/8 Functions [dcl.fct]
说
[...]函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针或对此类事物的引用的返回类型。[...]
为什么这么明确的规则?是否有一些语法甚至允许返回一个函数而不是函数指针?
我是否误解了报价?
typedef void (*fp)();
void foo(){}
fp goo()
{
return foo; //automatically converted to function pointer
}
这是一个试图返回函数的函数的一个相当人为的例子:
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.
是否有一些语法甚至允许返回一个函数而不是函数指针?
语法?当然有:
using fun = int (int);
fun function_that_returns_a_function();
这不会编译,因为 §8.3.5/8 中的规则禁止它。我不知道为什么这个规则特别存在——但考虑到“函数”类型没有任何大小,所以你不能在 C++ 中创建函数类型的对象。
我知道这可能不能完全回答你的问题,但它部分回答了
您可以从另一个函数返回一个函数(这就是 lambdas)
std::function<int (int)> retLambda() {
return [](int x) { return x; };
}