C++ 我如何推断像';[]和#x27;绑定比像'*';使用§;8.3.1和§;8.3.4?

C++ 我如何推断像';[]和#x27;绑定比像'*';使用§;8.3.1和§;8.3.4?,c++,c++11,types,language-lawyer,C++,C++11,Types,Language Lawyer,考虑表达式new(int(*[x])在§8.2/3中的示例中: #include <cstddef> char *p; void *operator new(std::size_t, int); void foo() { const int x = 63; new (int(*p)) int; // new-placement expression new (int(*[x])); // new type-id } #包括 char*p; void*运算符n

考虑表达式
new(int(*[x])在§8.2/3中的示例中:

#include <cstddef>
char *p;
void *operator new(std::size_t, int);
void foo() {
    const int x = 63;
    new (int(*p)) int; // new-placement expression
    new (int(*[x])); // new type-id
}
#包括
char*p;
void*运算符new(标准::size\u t,int);
void foo(){
常数int x=63;
新建(int(*p))int;//新建放置表达式
新的(int(*[x]);//新的类型id
}

我知道这个表达式将63个指针的数组分配给空闲存储中的
int
。从§8.3/6中,我们可以去掉
int(*[x])
中的括号,得到表达式
new(int*[x])。但是我在确定类型
int*[x]
是指向
int
的63个指针的数组,而不是使用§8.3.1和§8.3.4段指向63个
int
数组的指针时遇到了一个问题。

8/4处的语法图中隐含了优先级,在ptr声明器和noptr声明器之间的相互作用中。根据语法,
*id[x]
不能解析为
*id
后跟
[x]
(方括号前的声明符必须是noptr声明符),但只能解析为
*
后跟
id[x]
。然后,该读数与8.3.1指针的模式相匹配,而不是与8.3.4数组的模式相匹配。你必须从标准中的段落中推断出来。如果你阅读链接引用,你会看到:“标准本身没有指定优先级。它们是从语法中派生出来的。”但是,与其了解语法,不如更容易了解从语法中派生出来的表,或者至少比每次查看规范和阅读语法更容易查看引用表。优先级在8/4中是隐含的,在ptr声明器和noptr声明器之间的相互作用中。基本上,ptr运算符(其中一个星号
*
是一个)只能出现在顶层,或者用括号括起来。因此,
*id[x]
不能解析为
*id
后跟
[x]
(方括号前的声明符必须是noptr声明符),而只能解析为
*
后跟
id[x]
,这将匹配8.3.1指针模式,而不是8.3.4指针模式Arrays@IgorTandetnik明亮的请提交以上文本作为答案,以便我可以关闭线程。非常感谢。