如何将这个c++表达式解释为调用

How is this C++ expression interpreted as an invocation?

本文关键字:表达式 解释 调用 c++      更新时间:2023-10-16

在"Inside the c++ Object Model"中,作者给出了下面的代码示例,该代码可能存在歧义,需要解析器提前解析:

…如果c++抛弃了C的声明语法,那么就不需要预先判断以下语句是pf的调用,而不是它的定义:

// don’t know if declaration or invocation 
// until see the integer constant 1024 
int ( *pf )( 1024 );

他暗示这被解释为函数pf的调用。我看不出pf的声明是什么才能使它成为一个有效的调用

这是一个丑陋的int*声明称为pf被初始化为值1024。但是,如果没有显式强制转换,则此转换无效:

int ( *pf )((int*)1024);

所以问题中给出的行相当于:

int* pf = 1024;

要理解为什么,考虑int ((((*pf))));int* pf;相同。你可以在声明符周围加上任意数量的圆括号。

T D声明中,D的形式为
( D1 )
包含的declarator-id的类型与声明
中包含的declarator-id的类型相同。T D1
括号不会改变嵌入的声明符id的类型,但它们可以改变复杂声明符的绑定。

我看不出有任何理由认为这是函数调用。特别是考虑到它是从int开始的。我可以看到它怎么可能是一个函数指针的声明,直到它看到整数字面值。例如,如果它是:

int ( *pf )(int);

这将是一个类型为指针的pf的声明,该指针指向返回int并接受单个类型为int的参数的函数。

int ( *pf )( int); -这是声明