【问题标题】:Not allowed to return a function from a function. How could I?不允许从函数返回函数。我怎么能?
【发布时间】:2013-02-13 23:23:29
【问题描述】:

8.3.5/8 Functions [dcl.fct]

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

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

我是否误解了这句话?

typedef void (*fp)();

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

【问题讨论】:

  • @B.Nadolson 仅算作无效转化。
  • "自动转换为函数指针"。那么它就不是一个函数;)

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


【解决方案1】:

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

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++ 让我们清楚明了的事情而不是让我们从语法和其他各种规则(例如不可复制性)中派生出来的罕见实例之一。赞美他!
  • @LightnessRacesinOrbit:确实如此。我经常觉得从标准中推导出一个规则就像证明一个数论定理。在这种情况下不是。
  • 是的;有趣的是,当它确实发生时,实际上很少会从报警的 OP 中生成一个 SO 问题。
【解决方案2】:

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

语法?当然有:

using fun = int (int);

fun function_that_returns_a_function();

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

【讨论】:

    【解决方案3】:

    我知道这可能无法完全回答您的问题,但可以部分回答

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

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

    【讨论】:

    • 从技术上讲,lambdas 不是函数,它们是 functors 的实例
    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2013-04-17
    相关资源
    最近更新 更多