具有 SFINAE 虚拟参数的不明确模板

2024-01-27

考虑一种需要验证类型的情况T与另一个模板g(可能是一些enable_if表达式,例如)在另一个模板的虚拟参数内,如下所示:

template<class>        struct g { typedef void type; };
template<class, class> struct f {};
template<class T>      struct f<T, void> {};                  // Case A
template<class T>      struct f<T*, typename g<T>::type> {};  // Case B

int main() { f<int*, void> test; }

这里,为了简单起见g并没有真正做任何事情。中的第二个参数Case B是在非推导的背景下,因此直觉上人们会认为Case B比更专业Case A。遗憾的是,gcc 和 clang 都会抱怨上面的实例化中的模板不明确。

如果要删除虚拟参数,则它可以正常编译。添加非推导参数如何以某种方式破坏合理的期望T*比更专业T?

这是使用替换算法的快速检查:

   f<Q , void      >
-> f<T*, g<Q>::type> // [failed]

   f<Q*, g<Q>::type>
-> f<T , void      > // [to fail or not to fail?]
// One would assume that 2nd parameter is ignored, but guess not?

当出现歧义时,可以使用模板的部分排序来解决它。然而,这种部分排序是在模板上建立的,因为它们是before任何替换都会发生,而不是after(部分或全部)替换已执行 - 这是您所期望的替换int for T in typename g<T>::type,这产生typename g<int>::type因此(因为定义g) void.

第 14.8.2.4/2 段指定了如何建立部分排序(参见这个答案关于SO https://stackoverflow.com/a/17008568/1932150有关以下段落的更详细讨论):

使用两组类型来确定部分排序。对于每个涉及的模板都有 原始函数类型和转换后的函数类型。 [ 注:转换类型的创建 14.5.6.2 中描述。 ——尾注] 推导过程使用转换后的类型作为参数 template 和另一个模板的原始类型作为参数模板。这个过程要进行两次 对于偏序比较中涉及的每种类型:一次使用转换后的 template-1 作为 参数模板和 template-2 作为参数模板,并再次使用转换后的 template-2 作为参数模板,template-1 作为参数模板。

在任何替换之前,不知道什么值T会假设,你无法判断(编译器也无法判断)是否case B或多或少比专业化case A。因此,这两个专业都不比另一个专业更专业。

换句话说,问题不在于这种部分专业化是否:

template<class T> struct f<T, void>; // Case A

比这个更专业(通过部分替换获得):

template<class T> struct f<T*, void>; // Case B

如果那是你所拥有的,答案显然是case B更加专业化。相反,问题是是否为了任何可能的T,这个专业:

template<class T> struct f<T, void>; // Case A

比这个更专业:

template<class T> struct f<T*, typename g<T>::type>; // Case B

因为这不能为任何T,情况 B 既不比情况更专业,也不比情况更不专业case A,当两者都可行时,你就会产生歧义。

如果您想知道部分排序是否考虑非推导上下文中的参数,第 14.8.2.4/11 段的注释中提到了这一点:

大多数情况下,所有模板参数都必须有值才能推导成功,但对于部分模板参数 排序目的模板参数可以保留没有值,只要它没有在类型中使用 用于部分排序。 [注意:考虑在非推导上下文中使用的模板参数 用过的。 ——尾注 ]

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

具有 SFINAE 虚拟参数的不明确模板 的相关文章

随机推荐

  • Twitter 引导表分页

    我目前正在引导程序中处理表 它工作得很好 目前我遇到分页问题 我试图将数据动态推入表中 一旦数据变得太大 表就会向下扩展 如何对表进行分页 如果你想在 Bootstrap 中使用 Datatables 你需要初始化它 Table initi
  • 将 .jks 转换为 p12

    我怎样才能转换 jks文件到p12 jks是一个java密钥存储文件 那么我如何将它转换为p12 format 将 JKS 文件转换为 PKCS12 格式 Java 1 6 x 及更高版本 keytool importkeystore sr
  • 如何最好地从截断正态分布中获取样本?

    我已经做了一些搜索 但我似乎无法找到从截断正态分布中采样的合理方法 没有截断我正在做 samples np random normal loc x scale d for x d in zip X D X and D是浮动列表 目前我正在实
  • WIX:多个功能/文件夹的重复 ID 问题

    我是 Wix 的新手 正在创建一个多功能 Wix 项目 我们的产品有 4 个模块 每个模块都必须作为一项功能包含在 Windows 安装程序中 但所有功能都共享相同的文件夹结构 我正在使用命令行来构建我的 Wix 项目 将每个模块收集到不同
  • 使用 JsonWebToken 时遇到问题; JsonWebToken 错误:必须提供 JWT

    我正在使用 Vue 构建我的第一个 SPA 项目 我决定使用 NodeJS 作为后端 但是 我在使用 JsonWebToken 构建登录功能时遇到了麻烦 我写了一些代码来查看 JWT 如何工作 当我尝试查看 JWT 如何验证时 服务器给了我
  • 如何将全局自定义样式应用于android.support.design.widget.TextInputEditText?

    我有我的AppTheme定义于style xml我在其中为所有应用程序全局应用自定义样式TextView EditText Button etc 现在我想做同样的事android support design widget TextInpu
  • Visual Studio 2019 Xamarin.Forms 项目中未命中断点

    我正在开发 Xamarin Forms 添加 我不知道昨天是否在 Visual Studio 2019 上更新 16 5 1 是原因 但是当我处于调试模式时 在 Android 项目上与我的设备连接时断点不会命中 有趣的是我的应用程序运行正
  • Bootstrap colorpicker 基本示例不起作用

    我想为 bootstrap 使用颜色选择器插件 https farbelous io bootstrap colorpicker index html https farbelous io bootstrap colorpicker ind
  • 迭代c中的结构体

    我正在编写一个与此代码类似的单元测试 并且我正在尝试在设置值时测试它们 以便我知道发生了什么 当我运行以下代码时 我不明白为什么 ptr 值没有设置为 1 相反 当我运行它时 它给出的输出为 10 64 0 0 任何解释或建议将不胜感激 i
  • VBS 中的 MSGbox 根据变量值进行更新

    只是想知道我如何拥有一个 MSgbox 来显示不断变化的变量值 基本上 一个数字每次循环时都会添加一个 我想在不必打开一百万个窗口的 MSGbox 中显示它 解决方法是使用PopUp Set objShell WScript CreateO
  • 如何将值查询集的值追加到数组?

    我的观点 py from django db models import Count def test1 request states Loksabha objects values state distinct state terms L
  • Ionic 导航栏:标题未在 Android 设备上居中

    我对 Ionic 很陌生 但我已经喜欢它了 我想用nav bar所以我实现了以下index html
  • 编写不使用循环索引的 for 循环的 Pythonic 方法[重复]

    这个问题在这里已经有答案了 这与以下代码有关 该代码使用 for 循环生成一系列随机偏移量以供程序中其他地方使用 该 for 循环的索引未使用 这导致 Eclipse PyDev 将 有问题的 代码突出显示为警告 def RandomSam
  • 如何在 Actionscript 3 中将十六进制转换为十进制?

    如何在 Actionscript3 中将十六进制 字符串 转换为十进制 int Number int and uint类有toString 接受的方法radix作为参数 radix指定用于数字到字符串转换的数字基数 从 2 到 36 如果不
  • 如何从 DOM 中删除 element.nativeElement?

    我尝试了这样的方法 ViewChild draggable private draggableElement ElementRef this draggableElement nativeElement remove HTML div Bl
  • MVC3 ajax 将多个复选框值发送到控制器

    我正在尝试使用 MVC3 来完成以下任务 我有一个包含多个值的表 使用ajax我希望能够选择作为表一部分的删除复选框 对于任意数量的行 使用ajax将结果发布到控制器进行处理 我目前遇到的问题是我无法让控制器接受来自 ajax post 的
  • Websocket 因 1006 错误而断开连接,无原因

    我正在我的网页游戏中记录断开连接 似乎 75 的会话因代码 1001 正常 而断开连接 25 的会话因代码 1006 错误 而断开连接 https www rfc editor org rfc rfc6455 https www rfc e
  • 五个不同的 GAE 站点可以共享一个公共数据存储吗?

    除了特定站点的数据存储之外 您是否还可以在所有网站之间共享一个数据存储 比如连接到与主 MySQL 数据库不同的 MySQL 数据库 并不真地 两种解决方法 使用同一应用程序的五个 版本 而不是五个不同的应用程序 他们将共享相同的数据存储
  • 将 python django 项目 1.3 升级到 1.5

    目前我有一个使用 django 版本 1 3 的 python 项目在 Mountain Lion OS 上运行 现在我想将其升级到 django 1 5 但是当我把它放在尝试做的时候python manage py runserver我收
  • 具有 SFINAE 虚拟参数的不明确模板

    考虑一种需要验证类型的情况T与另一个模板g 可能是一些enable if表达式 例如 在另一个模板的虚拟参数内 如下所示 template