2012-02-26 61 views
2
$ cat -n cons.cpp 
    1 #include <iostream> 
    2 
    3 using namespace std; 
    4 
    5 int return1() { 
    6  return 1; 
    7 } 
    8 
    9 int main() { 
    10  cout<< return1.m_one << endl; 
    11  return 0; 
    12 } 
$ g++ cons.cpp 
cons.cpp: In function 'int main()': 
cons.cpp:10: error: request for member 'm_one' in 'return1', 
      which is of non-class type 'int()()' 
$ 

也許這是編譯器特定的,但在上面的g ++中報告的int()()中額外的一對括號是否存在一些意義/含義?爲什麼g ++將函數報告爲具有int()()類型?

+1

除非我完全誤解了代碼,你試圖訪問一個函數指針的成員?因此錯誤。它被報告爲int()(),它看起來很像int(*)(void),它是一個指向一個函數的指針,它使用void並返回int。可能是錯誤的,所以只是猜測 – Lefteris 2012-02-26 08:21:01

+0

是的,代碼是錯誤的,我期望一個錯誤。 – Lazer 2012-02-26 08:41:42

+0

在gcc(4.4。1)(僅限C),錯誤完全不同。 錯誤:請求成員m_one中的東西不是結構或聯合 在g ++(4.4.1)中:我得到: | error:請求成員'm_one'在'return1'中,它是非類類型的'int()' 因此,它完全是編譯器特定的,並且在相同編譯器的版本之間不同。 – Lefteris 2012-02-26 08:47:35

回答

5

這種語法的想法是這樣聲明的參數和返回值:

  • 內部對括號表示我是一個功能
  • 上左側的int裝置我的返回類型爲int
  • 右對括號意味着我沒有參數

因此,如果功能已宣佈

int return1(int a) 

的錯誤信息會談論int()(int)

但函數類型的表示方式確實取決於編譯器以及版本。例如。我剛剛嘗試過的GCC 4.5.1只是簡單的說int()就像你所建議的那樣更直觀。

5

函數指針將是int (*)()int()()不是合法的語法,但我可以看到一個漂亮的打印機如何輸出它的函數類型。

這是什麼語法將實際上意味着作爲一個類型說明符,如果它是合法的,是:

function taking no arguments 
    ↓↓ 
int()() 
↑↑↑ ↑↑ 
    and returning int(), i.e. a function that takes no argument and returns int. 

但在C和C++函數直接,而是返回函數必須返回函數指針禁止的。類似地,你不能直接返回一個數組(int()[10]

函數類型實際拼寫的方式沒有這些圓括號中的一個。這是合法的時候,例如,用於std::function

   ↓↓↓↓↓ 
std::function< int() > foo = []() -> int { return 1; }; 
+0

+ 1用箭頭格式化答案:) – Lefteris 2012-02-26 08:52:39

+0

這個語法實際上是什麼意思,如果它是合法的。嗯... – 2012-02-26 08:56:28

+0

@JohanLundberg由於我的意思是你可以使用C++的語法來解析語句,看看它是什麼意思,但有一條規則禁止函數返回另一個函數。例如,使用'std :: function'來獲取需要類型聲明的上下文:'std :: function foo;'給出錯誤:'error:函數不能返回函數類型'int()'' – bames53 2012-02-26 09:19:45

1

上C++ 11啓用編譯器,int()()在錯誤消息中的意思是「可調用元件(第一())不採取任何參數(第二())返回int。(C++ 03和像int(*)() C99函數指針是自解除引用,並調用INT(*)()或INT(&)()是統一消息)

這是return1實際上是(函數指針或引用),而且是int相同,因此需要不是「複合類型」,編譯器抱怨.和後面的成員

+0

即使在C++ 11中,int()()也不是合法的語法。它實際上的意思是一個函數,它不需要任何東西,並返回'int()'就像'int()[]'意味着一個函數,它不接受任何東西並且返回一個int數組。在C++ 03以及C++ 11中,這個類型意味着'函數不需要任何東西並且返回一個int',它被拼寫成int()。例如。 'std :: function foo = []() - > int {return 1; }' – bames53 2012-02-26 08:43:43

+0

@ bames53 我不說是「法律語法」:我在錯誤信息中說「它的意思是」。 法律語法爲int(* fn)()和int(&fn)(),但由於「call action」對於(fn())都是相同的,所以消息省略了*或&。 對不起,不清楚。我只是更新消息 – 2012-02-26 09:08:44

相關問題