参数中的前向声明与“常规”前向声明之间的区别

丹尼尔·戴

(模板)自变量中的前向声明(使用详细的类型说明符)与“常规”前向声明之间的区别(如果有)?

void foo(struct bar *);

// vs

struct bar;
void foo(bar *);

// ------ and also -------

std::unique_ptr<class Baz> one;

// vs

class Baz;
std::unique_ptr<Baz> two;
迈克尔·肯泽尔

让我们首先指出,“前向声明”是一种通俗易懂的口语,用于指代某些类型声明的某种常见实际用法。就C ++标准而言,没有向前声明之类的东西。只是声明。

考虑到这一点,我相信

void foo(struct bar *);

struct bar;

就其对名称的影响bar而言。bar如果没有先前的声明,则这两个声明最终都会引入该结构的名称

C ++ 17中的相关段落似乎是[basic.lookup.elab] / 2(强调我的观点):

如果阐述型符被引入了类的关键字,这查找没有找到先前声明类型名称,或[...]阐述类型说明符是一个声明,介绍了类名如[ basic.scope.pdecl]。

如果遇到不包含嵌套名称说明符精化类型说明符则将执行非限定名称查找,以查看该名称是否已经为对应类型命名。如果未找到先前声明的名称,则elaborated-type-specifier变为该名称的类类型的声明…

正如geza所指出的,可能存在差异的一种方式与引入名称的范围有关。

struct bar;

总是将名称引入声明出现的范围,作为其他任何类型声明的一部分出现的详尽的类型说明符会将名称引入最接近的封闭名称空间[basic.scope.pdecl] / 7

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章