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

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

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

随机推荐

  • 我可以在 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