2015-04-06 65 views
7

§8/ 5:我需要在規範中關於§8/ 5一些幫助

尾隨收益型可選屬性符-SEQ appertains到指定的回報類型。 type-id in a trailing-return-type包含最長可能的序列abstract-declarator s。 [注:這解決了數組和函數聲明符的模糊綁定。 [示例:

auto f()->int(*)[4]; // function returning a pointer to array[4] of int 
        // not function returning array[4] of pointer to int 

末端示例]末端注]

的 「在尾隨收益型型-ID」 沒有意義對我來說,簡直因爲追尾返回類型根據語法不包含type-id

我也不明白數組和函數聲明的「模糊綁定」。至於我能理解

auto f() -> int*[4]; // function returning an array of 4 pointers to int 
auto f() -> int(*)[4]; // function returning a pointer to an array of 4 ints 
+4

你可以問一個問題嗎? –

+2

由於* trailing-specifier-seq *生成/是* type-specifier-seq *的一個子集,所以* * type-id *指的是' - >'後面的所有東西*(看着C++ 11§7.1.6/ 1)。 –

+0

@ Cheersandhth.-Alf我認爲是的。不過,這是相當草率的寫作。 –

回答

5
int *f(); 

聲明的()返回指針int功能。

int *f()[4]; 

聲明()返回的4個指針數組int的功能。請注意,這是不合格的。

int (*f())[4]; 

聲明的返回()指針4 int陣列的功能。

現在,

auto f() -> int(*)[4] 
//  ^^^^^^^^^^^^^--- 

什麼規則解析是[4]是否是尾隨收益型的一部分,因此該函數聲明的一部分。如果[4]尾隨返回類型的一部分,則上述聲明聲明()函數返回指向4 int數組的指針。

如果沒有,那麼[4]將形成一個數組聲明不屬於函數聲明的一部分,和解析將由[dcl.array]/P1管轄:

在聲明T D其中D具有如下形式:

D1 [ constant-expression_opt ] attribute-specifier-seq_opt 

和在聲明T D1標識符的類型是 「衍生聲明符類型列表T「[...如果]的 常量表達式的值是N,[...]的D標識符的類型是 「衍生聲明符類型列表陣列的NT」。

,自auto f()-> int (*)聲明f爲「()函數返回指針int」,取代告訴我們,這將宣佈一個函數返回的4個指針數組int,就像int *f()[4];

+1

根據[dcl.decl] p4中的語法,在這個'[4]'的左邊必須有一個'noptr-declarator',但似乎'f() - > int(*)'確實沒有資格成爲'noptr-declarator'。 – cpplearner

+1

...在[N2541](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm)中,'f() - > int(*)'限定作爲一個'直接聲明符',它可以出現在'[4]'的左邊,所以消歧是必要的。但從那時起,宣告人的語法就發生了不少變化。我想知道這些變化之一是否已經默默地消除了模糊性。 – cpplearner