2013-02-13 73 views
4

8.3.5/8 Functions [dcl.fct]不允許從函數返回函數。我怎麼能?

[...] 功能不應有 類型陣列或功能的返回類型,儘管它們可能具有類型指針或引用的這樣的事情返回類型。 [...]

爲什麼這麼明確規則?是否有一些語法甚至允許返回一個函數而不是函數指針?

我是否錯過了解釋報價?

typedef void (*fp)(); 

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

回報(無效*)富! – 2013-02-13 23:25:05

+1

@ B.Nadolson只能算作無效轉換。 「 – 2013-02-13 23:26:20

+1

」自動轉換爲函數**指針**「。然後它不是一個函數;) – mfontanini 2013-02-13 23:58:58

回答

3

這是嘗試一種功能相當一個人爲的例子返回一個函數:

void foo() { } 

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

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

這是我從鏘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

+1的實例:正確。此外,這只是C++爲我們提供清晰明確的罕見實例之一,而不是讓我們從語法和其他各種規則(如非可複製性)中派生出來。讚美他! – 2013-02-13 23:40:21

+0

@LightnessRacesinOrbit:確實如此。我常常想從標準中推導一個規則,就像證明數論的一個定理。不是在這種情況下。 – 2013-02-13 23:44:32

+1

是啊;有趣的是,當它發生時,實際上從警報的OP中產生一個SO問題是非常罕見的。 – 2013-02-13 23:49:46

1

我知道這可能並不完全回答你的問題,但它這樣做部分

您可以從另一個函數返回一個函數(這是lambda表達式是什麼)

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

從技術上講,lambdas不是函數,它們是*函子* – 2013-02-13 23:32:45

1

是有一些甚至允許返回一個函數而不是函數指針的語法?

語法?當然有:

using fun = int (int); 

fun function_that_returns_a_function(); 

由於§8.3.5/ 8中的規則禁止它,所以不編譯。我不知道爲什麼規則特別存在 - 但考慮到「函數」類型沒有任何大小,所以您不能在C++中創建函數類型的對象。

相關問題