模板中的类使用不完整

2024-02-18

我感到非常惊讶的是,在 g++ 的各种采样版本上,以下内容编译时没有错误或警告:

// Adapted from boost::checked_delete()
template <class T> inline void assert_complete()
{
  typedef char type_must_be_complete[ sizeof(T) ? 1 : -1 ];
  (void) sizeof(type_must_be_complete);
}

class X;

void f()
{
  assert_complete<X>();
}

class X {};

int main() {}

如果定义X丢失或位于不同的翻译单元中,我确实收到错误。

但在上面的程序中,不是定义f我的模板的单个实例化点?这不是不完整的吗X在那个实例化点有语义错误吗?

(C++03 和/或 C++11 草案)标准是否将此程序称为格式良好、格式错误、格式错误但不需要诊断或未定义的行为?

编辑:@David Rodriguez - dribeas 报告 clang++、comeau 和 Visual Studio 2010 也接受类似的代码。


(我正在等待 Alf Steinbach 发布答案,但由于他没有这样做,我将发布他在 Lounge C++ 聊天中提到的参考资料):

标准表示执行模板实例化after翻译单元已经被翻译,因此模板实例化会及时发生after所有非模板化元素都已被处理。 2.2 翻译阶段对此进行了描述:

第 1-6 段定义了预处理器的工作和基本信息textual操作(字符集转换、文字串联……)

7/ 分隔标记的空白字符不再重要。每个预处理标记都会转换为一个标记。 (2.7)。对生成的标记进行句法和语义分析,并将其翻译为翻译单元。

8/ 已翻译的翻译单元和实例化单元按如下方式组合:检查每个已翻译的翻译单元以生成所需实例化的列表。找到所需模板的定义。包含这些定义的翻译单元的源是否需要可用是由实现定义的。执行所有必需的实例化以生成实例化单元。 [ 注意:这些与已翻译的翻译单元类似,但不包含对未实例化模板的引用,也不包含模板定义。 — 尾注] 如果任何实例化失败,则程序格式错误。

为了简洁起见,我删除了一些注释。现在,重要的一点似乎是代码的翻译不会在一步中触发模板实例化,然后在后面的步骤中实例化模板。这反过来意味着如果类型是complete在翻译单元中的任何位置,它都会在编译器到达实例化时已被处理。

免责声明:对于我尝试过显示完全相同行为的所有编译器(gcc、clang、comeau、VS 2010)来说,这似乎是一个很好的理由,但这仅表明when在执行实例化时,它没有明确声明该类型在模板实例化时可能不完整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板中的类使用不完整 的相关文章

随机推荐

  • 如何将 onClick 侦听器添加到 CKEditor 中的 fileButton?

    我正在使用图像上传器插件 并且有一个如下所示的按钮定义 type fileButton id uploadButton filebrowser info txtUrl label editor lang image btnUpload fo
  • 显示张量流数据集中的示例不起作用

    我想加载张量流flowers https www tensorflow org datasets catalog tf flowers数据集并使用可视化tfds show examples https www tensorflow org
  • 如何让 NUnit Console Runner 打印测试名称

    NUnit 控制台运行程序仅在测试导致打印某些内容时才打印到控制台 有没有办法让它打印每个测试名称 类似于摩卡的东西 如下所示 您正在寻找 labels option 输出级别有多种选择 on off or all 并且随着 v3 6 即将
  • Zend框架1.12的简单路线

    我正在寻找一些简单的东西 但经过多次搜索后我不知道该怎么做 我查看了 Zend 1 12 Route 的文档 但我不太明白 我在 Zend Framework 中有这些页面 application views scripts index 索
  • cdnjs 和 npm 有什么区别?

    cdnjs 和 npm 有什么区别 npm 是一种 CDN 内容分发网络 吗 npm Node Package Manager 是一个由 Node js 模块 包 组成的存储库 您可以从中搜索并下载模块 cdnjs 是 JavaScript
  • ER模型对函数依赖解决方案的解释

    我正在尝试理解一项将 ER 模型转换为函数依赖关系的练习的解决方案 正如您在上面所看到的 我们只有关系名称 除此之外没有其他任何东西 通过解决方案 他们以某种方式得出结论 母亲 女儿 父亲 父亲 女儿 母亲 母亲 儿子 父亲 父亲 儿子 母
  • 为什么我不能使用 php 将数据插入 mysql 数据库

    这相当令人沮丧 我确信这是一个简单的解决方法 据我所知 我的代码是正确的 这让我相信存在服务器问题 我已经创建了数据库 我可以从命令行将数据插入表中 如果有帮助的话我正在使用WAMP
  • 对前十个结果进行排序

    我得到一个列表 其中我通过以下方式保存结果 City Percentage Mumbai 98 30 London 23 23 Agra 12 22 列表结构为 Mumbai 98 30 London 23 23 我以列表的形式保存这些记录
  • 如何在 Windows 上向 Perl 发送信号?

    我有一些建立信号处理程序的 Perl 代码 SIG KILL sub 我的任务是将其移植到 Windows 我想知道如何从 C 类生成此信号 我看到了Process Kill方法中的System Diagnostics Process类似乎
  • 使用工厂的 Angular.JS API

    我编写了一个后端服务 供 Angular JS 前端使用工厂使用 如下所示 angular module app social ngResource factory Social function http return me functi
  • 如何从 ValueTransformer 中的 Punctuator 实例向下游转发事件?

    在 KafkaStream 中 当实现值转换器 or 带键的值转换器 on 转换 打电话 我安排一个新的标点符号 当方法圈点 of the 标点符号执行后我希望它使用上下文实例向下游转发事件 然而 作为 DSL 拓扑的一部分 上下文实例似乎
  • 从 CSV 导入 Ruby 数组,第一个字段作为哈希键,然后查找给定标题行的字段值

    也许有人可以帮助我 从 CSV 文件开始 如下所示 Ticker Price Market Cap ZUMZ 30 00 933 90 XTEX 16 02 811 57 AAC 9 83 80 02 我设法将它们读入数组 require
  • 如何使用 Boost Graph Library 创建named_graph?

    我目前正在使用 Boost Graph Library 我需要独特的边和顶点 不幸的是 升压图不提供此功能 所以每次插入边或顶点之前我都必须检查手册 现在我发现了这个 http www boost org doc libs 1 49 0 b
  • Node.js Elastic Beanstalk 在重负载下拒绝连接 (ECONNRESET)

    我将一个简单的 Node js Express 应用程序部署到 Elastic Beanstalk 使用loadtest https www npmjs com package loadtestnpm 包 我直接使用 EC2 实例 绕过 E
  • 由于缺少元数据 dll,.NET Framework 项目 4.5.2 无法在 Jenkins 中构建

    无法使用 Jenkins 构建 NET Framework 解决方案 我收到一条错误消息CSC error CS0006 Metadata file packages Microsoft CodeAnalysis Analyzers 1 1
  • 非法继承,同时用自我类型扩展特质

    我对以下代码感到困惑 trait T1 type S trait T2 self T1 gt case class ClS s S object O extends T2 它给出以下错误消息 非法继承 tests O type 不符合tes
  • 操作系统如何知道物理内存的实际大小?

    当计算机启动时加载操作系统时 操作系统如何知道硬件信息 是否有一些io指令或引导程序从BIOS获取信息 主板固件 也称为 BIOS ACPI 接口或 EFI 允许操作系统找出系统中 RAM 和 ROM 的物理映射 例如 这是启动 Linux
  • 将同一类别添加到多个类中

    我有一个 Objective C 类别 我想将其添加到多个类中 而不重复该类别中包含的代码 我只是想将相同的方法添加到多个类中 我有现有的类别NSManagedObject子类 Book Chapter Page 并且我想以干净且可维护的方
  • Java的全栈框架[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个完整的 Java 堆栈框架 从持久性到视图生成 CRUD 我没有使用 Rails 风格框
  • 模板中的类使用不完整

    我感到非常惊讶的是 在 g 的各种采样版本上 以下内容编译时没有错误或警告 Adapted from boost checked delete template