2017-08-04 84 views
4

樣品的編號:意義的I(I())

typedef int I; 
struct X{ X(int); }; 

int main() 
{ 
    int(int()); 
    X(X()); 
    I(I()); 
} 

int(int());是使用功能性的轉換符號的表達 - 這是與初始化的臨時int的值初始化int

X(X());是一個名爲X的函數的聲明,它不返回返回struct X的參數。

我的問題是:這裏的I(I())是什麼意思?標準中的哪些規則決定了這三種情況之間的意義差異?

+1

'typedef int I'使得'I'的行爲*完全像'int'。它只是分配另一個名字。因此,行I(I())和int(int())具有完全相同的含義。有關'typedef'的更多信息,請參見[[dcl.typedef](https://timsong-cpp.github.io/cppwp/dcl.typedef)]。 –

+0

根據gcc/clang,它和'X'一樣,函數'I'的聲明返回'int'。 – Jarod42

+1

所有3個都是函數decl – Sopel

回答

3

該規則指出,如果一個構造對於一個聲明或一個聲明來說語義不明確,那麼它就被認爲是一個聲明。

[stmt.ambig] 1有一個在語法涉及表達語句和聲明的歧義:一個expression- 語句與函數式明確的類型轉換(5.2.3),作爲其最左邊的子表達式可以是從聲明中無法分辨的 tinguishable其中第一個聲明符用(在這種情況下該語句是一個 聲明開始。

X(X());是模糊的,因爲它可以是一個演員,或者一個函數聲明,所以它被認爲是一個聲明。

int(int());不能是函數聲明,因爲作爲關鍵字的int不是函數的有效名稱。所以,沒有歧義,這是一個演員。

同樣,I(I());不能是一個函數聲明,因爲雖然不是關鍵字,I是不是一個有效的名稱可能是因爲它會重新聲明爲一個函數,這是不允許的類型I,因此它是一個演員。

+0

你在說什麼'我(我());'然後準確地說? –

+0

@ M.M正如我理解的規則,它是一個功能強大的轉換,並且初始化值是臨時的,就像'int(int())'一樣。 – user2079303

+0

這可能是不允許重新定義typedef的規則:使用typedef說明符聲明的名稱變爲typedef名稱。在其聲明的範圍內,typedef-name在語法上等同於關鍵字和......。關鍵字可能不會被重新定義......但這似乎有點模糊。 – user2079303

相關問題