第8.3.4 / 1节N3797:
在声明T D中,D的格式为
D1 [constant-expressionopt] attribute-specifier-seqopt
和。中的标识符类型 声明T D1是
“derived-declarator-type-list T”
,然后是类型 D的标识符是数组类型;
我已经了解Q|A的derived-declarator-type-list
是什么。
但我对声明T D
的示例感兴趣,因此声明T D1
中的标识符类型不是“derived-declarator-type-list T”
的形式。
这是T D的标识符类型,其中D的格式为
D1 [ constant-expressionopt] attribute-specifier-seqopt
不是数组类型。它有可能吗?
答案 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;
这对你来说更容易理解吗?
这种句子清楚地表明,标准的主要目标不是易于阅读,而是表达明确复杂的语言结构,并完全转换所有语义和句法变体。