模板中的类使用不完整

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(使用前将#替换为@)

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

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 如何将 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