0

在“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可以使它成为有效的调用。

4

2 回答 2

2

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

于 2013-03-15T10:36:44.577 回答
2

int*这是使用值 1024 初始化被调用的丑陋声明pf。但是,如果没有显式强制转换,这种转换是无效的:

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

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

int* pf = 1024;

要了解原因,请考虑int ((((*pf))));与 相同int* pf;。您可以在声明符周围放置任意数量的括号。

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

T D1

我看不出有任何理由将其视为函数调用。特别是考虑到它以int. 我可以看到它如何可能是函数指针的声明,直到它看到整数文字。例如,如果它是这样的:

int ( *pf )(int);

这将是一个pf指向函数的类型指针的声明,该函数返回int并采用一个类型的参数int

于 2013-03-15T10:47:52.423 回答