5

8.3.5/8 Functions [dcl.fct]言う

[...]関数は、戻り型の型の配列または関数を持ってはなりませんが、戻り型の型のポインターまたはそのようなものへの参照を持っている場合があります。[...]

なぜルールを明示するのですか?関数ポインタではなく関数を返すことさえできる構文はありますか?

見積もりの​​解釈を間違えていますか?

typedef void (*fp)();

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

3 に答える 3

3

これは、関数を返そうとする関数の非常に不自然な例です。

void foo() { }

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

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

これは私がClang3.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.
于 2013-02-13T23:38:00.367 に答える
2

関数ポインタではなく関数を返すことさえできる構文はありますか?

構文?確かにあります:

using fun = int (int);

fun function_that_returns_a_function();

§8.3.5/8のルールで禁止されているため、コンパイルされません。ルールが具体的に存在する理由はわかりませんが、「関数」型にはサイズがないため、C++で関数型のオブジェクトを作成できないと考えてください。

于 2013-02-13T23:37:33.657 に答える
1

これはおそらくあなたの質問に完全には答えないでしょうが、部分的には答えます

別の関数から関数を返すことができます(これがラムダです)

std::function<int (int)> retLambda() {
    return [](int x) { return x; };
}
于 2013-02-13T23:30:27.130 に答える