c++ - 参数中的前向声明与“正常”前向声明之间的区别
问题描述
(如果有的话)(模板)参数中的前向声明(使用详细的类型说明符)和“正常”前向声明之间的区别是什么?
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]。
如果遇到不包含嵌套名称说明符的详细类型说明符,则执行非限定名称查找以查看该名称是否已经命名了相应的类型。如果没有找到先前声明的名称,那么详细类型说明符将成为该名称的类类型的声明......
正如 geza 所指出的,可能存在差异的一种方式与引入名称的范围有关。尽管
struct bar;
总是将名称引入声明出现的范围,作为任何其他类型声明的一部分出现的详细类型说明符会将名称引入最近的封闭命名空间[basic.scope.pdecl]/7。
推荐阅读
- javascript - 是否可以在 Styles.scss 中动态导入 Variables.scss 文件?
- r - 2 *“X2B”中的错误:二进制运算符的非数字参数
- python - django:将 DRY 和代码重用提升到一个新的水平?
- python - 使用朴素贝叶斯分类的 Twitter 情绪分析仅返回“中性”标签
- laravel - 如何在 laravel 中捕获 NotFoundHttpException 以发送自定义响应?
- python - numpy 打印矩阵一行一行
- swift - 如何使用 Mabox 和 Swift 检索我下载的离线地图包的列表?
- node.js - 无法从cheerio 中的 img 标签获取正确的链接。获取错误的链接格式
- project-reactor - reactor-core 3.1 版破坏了现有代码
- mysql - 找到每个项目中至少有一个的用户