理解derived-declarator-type-list和array decalrator

时间:2014-09-17 05:12:18

标签: c++ arrays

第8.3.4 / 1节N3797:

  

在声明T D中,D的格式为

     

D1 [constant-expressionopt] attribute-specifier-seqopt

     

和。中的标识符类型   声明T D1是“derived-declarator-type-list T”,然后是类型   D的标识符是数组类型;

我已经了解Q|Aderived-declarator-type-list是什么。

但我对声明T D的示例感兴趣,因此声明T D1中的标识符类型不是“derived-declarator-type-list T”的形式。

这是T D的标识符类型,其中D的格式为

D1 [ constant-expressionopt] attribute-specifier-seqopt 

不是数组类型。它有可能吗?

1 个答案:

答案 0 :(得分:1)

首先,我们在关于声明者的第8节中。在此上下文中,[]不能指定下标运算符(表达式,第5.2.1节),也不能指定lambda介绍人(表达式,第5.1.2章),而只能指定数组。

接下来,我们必须考虑到我们有简单且更复杂的声明符:

int ndigit[10];    // T is int, D is ndigit[10] which is an array type 
                   // the type of the identifier ndigit is derived declarator type int 
char *str[512];    // T is char*,  D is str[10] wich is an array type
                   // the type of the identifier str is derived declarator type char*  

了解这一切,我们必须深入呼吸,并从我们的语言习惯中退一步。

作为程序员,当我们阅读像

这样的英语句子时
    If P1 and P2 then P3

我们本能地理解有两个条件并在c ++中翻译:

    if (P1 && P2) P3;    // 2 conditions must be true and P3 will be done

但英语不是C ++!还有其他有效的含义。拿这个不相关的数学例子:

    ax²+bx+c =0   
    if Δ =b²-4ac and Δ >0 then there are two distinct roots 

在这个例子中,很明显,Δ =b²-4ac不是具有两个根的附加条件。这只是一种引入(不做额外的句子)在条件或结论中使用的命名约定的方法。

当然,人们可以说这种风格不是一种好习惯,我们应该写一下:

    ax²+bx+c =0   
    let's define Δ =b²-4ac 
    If Δ >0 then there are two distinct roots 

我完全同意!现在让我们将这种阅读应用于标准:

    In a declaration T D where D has the form
        D1 [ constant-expressionopt] attribute-specifier-seqopt
    Let the type of the identifier in the declaration T D1 be “derived-declarator-type-list T”
    Then the type of the identifier of D is an array type;

这对你来说更容易理解吗?

这种句子清楚地表明,标准的主要目标不是易于阅读,而是表达明确复杂的语言结构,并完全转换所有语义和句法变体。