为什么在函数参数列表中允许前向声明?

时间:2018-12-15 11:12:47

标签: c++

我认为不应编译此代码,但似乎编译器将struct NonExistingNeverDeclaredType*自变量视为前向声明(proof)。但为什么?

#include <iostream>

int foo(struct NonExistingNeverDeclaredType* arg) {
  return sizeof(arg);
}

int main() {
  std::cout << foo(nullptr) << std::endl;
  return 0;
}

https://ideone.com/v3XzCw

1 个答案:

答案 0 :(得分:10)

这是修饰类型说明符的属性,如果先前未声明该类型,它将引入一个声明:

cppreference

  

如果名称查找未找到先前声明的类型名称,则通过类,结构或联合(即不是通过枚举)引入elaborated-type-specifier,并且class-name是不合格的标识符,则进行详细说明-type-specifier是类名称的类声明。

它是否在函数参数列表中都没有关系。以下代码也有效:

class foo {
    class bar *b; // bar is not previously declared
};