如何将此C ++表达式解释为调用?

时间:2013-03-15 10:33:21

标签: c++

在“C ++对象模型内部”中,作者给出了以下可能不明确的代码示例,要求解析器预先解决它:

  

...如果C ++要抛弃C声明语法,则不需要lookahead来确定以下是pf的调用而不是它的定义:

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

他暗示这被解释为函数pf的调用。我无法看到pf的声明可以使这成为一个有效的调用。

2 个答案:

答案 0 :(得分:2)

int ( *pf )( int); - 这是宣言

答案 1 :(得分:2)

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

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

因此,问题中给出的行等同于:

int* pf = 1024;

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

  

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

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

int ( *pf )(int);

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