2012-12-29 53 views
13

Wikipedia我發現這一點:最苦惱的解析的目的是什麼?

A a(A()); 

[這]可以被消除歧義或者作爲

  1. 類[A]的變量定義,取類的一個匿名實例[A ]或

  2. 函數的函數聲明返回類型爲[A]並採用單個(未命名)參數,該參數是返回類型[並且不輸入]的函數。

大多數程序員期望第一,但C++標準要求它被解釋爲第二。

但是爲什麼?如果大多數C++社區都期待以前的行爲,爲什麼不把它作爲標準呢?此外,如果不考慮解析歧義性,以上語法是一致的。

有人請賜教嗎?爲什麼該標準將這作爲要求?

+0

哪裏有函數指針? –

+0

閱讀錯誤消息 - http://ideone.com/12sT80#view_edit_box不是類型爲'T(*)()'的函數指針? –

+0

@templateboy:該消息是誤導性的:在這種情況下,'a'實質上已經衰減爲函數指針以用於表達式'a.f'中,但是'a'的聲明本身與函數指針無關。 –

回答

5

假設MVP不存在。

你會如何聲明一個函數?

A foo(); 

將是一個變量定義,而不是一個方法聲明。你會介紹一個新的關鍵字?你會有一個更尷尬的函數聲明的語法?或者你更願意

A foo; 

定義一個變量和

A foo(); 

聲明函數?

你稍微複雜一點的例子只是爲了與這個基本的一致。 「更容易說」所有可以被解釋爲聲明的東西,將被解釋爲聲明「而不是」所有可以被解釋爲聲明的東西,將被解釋爲聲明,除非它是單個變量定義,在這種情況下,它是一個變量定義「

可能不是它背後的動機,但它的一個原因是的事情。

1

沒有特別的原因,除了[可能] K-ballo識別的情況。

這只是遺產。已經有int x;建築形式,所以當沒有任何參與者參與時,它似乎無法達到要求T x;

事後看來,我會想象如果語言是從頭開始設計的,那麼MVP將不存在......以及大量其他C++古怪。

回想一下,C++ 幾十年來發展了,即使現在,也只是由委員會設計的(參見:camel)。

5

這只是一個猜測,但它可能是由於這樣的事實,與給定的方法,你可以得到兩種行爲:

A a(A()); // this is a function declaration 
A a((A())); // this is a variable definition 

如果你要改變它的行爲是一個變量定義,然後函數聲明將會相當複雜。

typedef A subfunction_type(); 

A a(A()); // this would be a variable declaration 
A a(subfunction_type); // this would be a function declaration?? 
+1

+1這是一個很好的觀點。 –

+0

不完全正確,'A a(A());'是一個函數聲明。它可以被重寫爲'A a(A(*)())',即一個名爲'a'的函數,並返回一個類型爲'A'的對象,其參數是一個函數:'void - > A' 。嘗試編譯它以進行最簡單的檢查) – gluk47

3

它的遞歸定義的語法副作用。

這不是故意這樣設計的。它被發現並記錄爲最令人頭痛的解析。

5

對於C++,這是很簡單的:因爲規則有人提出,方式C.

在C中,不確定性只能用typedef和一些相當晦澀的代碼出現。幾乎沒有人偶然觸發它 - 事實上,除了專門用於證明可能性的代碼之外,它可能非常罕見。然而,無論好壞,單純模糊性的可能性意味着有人必須解決它 - 如果記憶成爲服務,丹尼斯·裏奇決定解決任何可以被解釋爲聲明的東西都是聲明,即使也有一個模棱兩可的解釋作爲定義。

C++增加了將圓括號用於初始化以及將函數調用作爲分組的功能,並且這使得他從模糊到普通的模糊。然而,改變它將需要違反規則,因爲它來自C.根據大多數人的預期,解決這種特殊的歧義,而不會創造出更多令人驚訝的六十多種,除非你願意完全拋棄與C的兼容性。

相關問題