类模板的成员函数如果从未被调用,是否不会被实例化?

2024-02-25

我刚刚开始了解一些模板基础知识。实际上,直到现在我才接受它作为事实,但我不太明白为什么会这样:

template <typename T,bool hasFoo>
struct Broken {
    void foobar(){
        if (hasFoo){T::foo();}
        else { std::cout << "BROKEN" << std::endl;}
    }
};

int main(){
    Broken<int,false> t;
    t.foobar();
}

虽然这有效:

template <typename T>
struct Works {
    void foo(){T::foo();}
    void bar(){std::cout << "WORKS" << std::endl;}
};

int main(){
    Works<int> t;
    t.bar();
}

不知怎的,这是显而易见的,但我只是想确保我没有遗漏一些东西: 这行得通吗,因为如果函数Works<int>::foo()从未被调用,它根本没有被实例化?

PS:为了避免误会:我知道,为什么Broken坏了,我最近有一个question https://stackoverflow.com/questions/33465830/how-to-fix-this-template与此相关,我得到了很好的答案,但在那之后我也认为Works<int>不应该编译,直到我不小心传递了一个“错误”的模板参数,并对它确实编译感到惊讶。


如果函数 Works::foo() 从未被调用,它根本就没有被实例化?

是的,类模板的非虚拟成员函数在需要时不会被实例化。

从标准来看,§12.8.1/10 隐式实例化 [temp.inst] http://eel.is/c++draft/temp.inst#10:

(强调我的)

实现不应隐式实例化函数 模板、变量模板、成员模板、一个非虚拟的 成员函数、成员类、类的静态数据成员 模板,或 constexpr if 语句 ([stmt.if]) 的子语句, 除非需要这样的实例化。

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

类模板的成员函数如果从未被调用,是否不会被实例化? 的相关文章

  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • 我可以在 bash shell 中对变量进行 for 循环吗?

    我正在学习 shell 我希望能够循环一些变量 我似乎找不到任何地方有人这样做过 所以我不确定这是否可能 基本上我只是想通过对每个变量使用相同的 sed 命令来省去自己的麻烦 但是该代码显然不起作用 我的问题是 是否可以循环变量 如果不能循
  • PHPExcel - 图表渲染和加载 Excel 给出错误

    require once PHPExcel 1 7 7 Classes PHPExcel php inputFileName RN Tracker xlsx inputFileType PHPExcel IOFactory identify
  • 将此 cURL 转换为 Guzzle

    我尝试阅读 Guzzle 文档 但我无法解决这个问题 我想使用 Guzzle 而不是 cURL 来执行以下操作 protected url https secure abcdef com cgi xml request server php
  • Javascript AOP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个 Javascript AOP 库 它的主要功能是什么 这是我到目前为止发现的 dotvoid
  • Angular 6/C#/MVC 以 Json Array of Array 的形式从控制器动态返回 JsonResult

    我正在尝试在 Angular 6 应用程序中将多个数据集导出到 Excel 为此 我使用 XLSX 和文件保存 如本例中所示 https medium com madhavmahesh exporting an excel file in
  • 使用 Redis 进行复合查询

    出于学习目的 我尝试在 Redis 中编写一个简单的结构化文档存储 在我的示例应用程序中 我正在对数百万个文档建立索引 这些文档看起来有点像下面这样
  • TensorFlow、批量索引(第一维)和排序

    我有一个形状为 params 张量 368 5 以及具有形状的查询张量 368 查询张量存储用于对第一个张量进行排序的索引 所需的输出具有以下形状 368 5 由于我需要它作为神经网络中的损失函数 因此所使用的操作应该保持可微分 另外 在运
  • 在WordPress中,如何在评论后重定向回引用页面?

    我在 WordPress 中的不同类型页面 存档 标签 搜索 主页 上启用了评论 并且在用户发布评论后 我希望将它们重定向回其引用页面 而不是单个帖子页面 有任何想法吗 把这个放在你的函数 php add filter comment po
  • 为什么在 UIView 再次添加到父级之前不调用 deinit ?

    我有一个 UIView 添加到 UIViewController 中 并且通常测试去初始化以确保我做的事情是正确的 但是 当我没有将 viewController 中的变量设置为 nil 并仅使用 removeFromSuperView 时
  • getResource() 无法加载 jar 中的内容

    我可以在 Eclipse 中成功加载 src 目录中某些包中的资源 现在 我导出 jar 右键单击 src 导出 jar 并保留默认设置 并且无法将资源加载到另一个 eclipse 项目中 我通过指示位于同一包名称中的类来构建资源的路径 U
  • 使用 fields_for 创建多个记录 - Rails

    我有两个模型 task and list items a task有很多list items 但我希望能够创造task还有很多list items如果用户想要所有内容都以一种形式 这是目前的样子 FORM
  • PHPDoc 文档生成器是在 Eclipse 中还是在 Eclipse 之外? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 Eclipse PDT 进行开发 我一直在代码中添加 phpdoc 注释 但实际上从未在
  • 导入 numpy 时出现 OpenBLAS 错误:`blas_thread_init 函数中的 pthread_creat 错误`

    突然间 我无法导入 numpy import numpy as np OpenBLAS pthread creat error in blas thread init function Error code 1 我正在运行 numpyAna
  • 使用 iPhone 的排序描述符对核心数据位置变化进行排序

    我有一个具有两个属性的 CoreData 实体 一个称为 position 另一个称为 positionChange 它们都是整数 其中position属性是当前位置 positionChange是前一个位置和新位置之间的差值 这意味着po
  • 颤动| Dart:URI 目标不存在

    我正在制作我的第一个应用程序来使用 Flutter 构建 Android 应用程序 我使用 Android Studio 作为 IDE 问题是当我导入 http 包时 import package http http dart as htt
  • scala 中两个数据帧的架构比较

    我正在尝试编写一些测试用例来验证源 csv 文件和目标 配置单元表 之间的数据 验证之一是表的结构验证 我已将 csv 数据 使用定义的架构 加载到一个数据框中 并将配置单元表数据提取到另一个数据框中 当我现在尝试比较两个数据帧的架构时 它
  • 用于验证邮政编码并检查无效字符的正则表达式

    我正在尝试验证邮政编码的输入 现在这个邮政编码应该适用于美国 加拿大 英国 所有国家 但省略任何特殊字符 所以我尝试 首先检查无效字符 如果通过 然后我检查邮政编码要么是美国 要么只是为了确保有有效字符且不超过 8 个 只要现在是美国 它们
  • 为什么第二次 cp 命令更快

    当我执行时cp folder1 folder2 rf 第一次大约需要10分钟 但是当我执行第二个命令时cp folder1 folder3 rf 大约需要 1 分钟 folder1包含大约 100 000 个文件 为什么第二次运行时间会有所
  • 强制使用 C++ override 关键字?

    我真的很喜欢 c 11 的新 override 关键字 我试图将它添加到我的代码中 如果编译器能够帮助我发现所有这些情况 那就太好了 有什么方法可以让编译器表现得好像 override 关键字是强制的吗 我正在使用 Visual Studi
  • 类模板的成员函数如果从未被调用,是否不会被实例化?

    我刚刚开始了解一些模板基础知识 实际上 直到现在我才接受它作为事实 但我不太明白为什么会这样 template