替换失败是否是依赖非类型模板参数的错误?

2024-03-11

假设我有这些模板别名:

enum class enabler {};

template <typename T>
using EnableIf = typename std::enable_if<T::value, enabler>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, enabler>::type;

我可以在 GCC 中执行以下操作:

#include <iostream>

template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is polymorphic\n"; }

template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is not polymorphic\n"; }

struct foo { virtual void g() {} };

int main() {
    f(foo {});
    f(int {});
}

它打印:

是多态的
不是多态的

这符合我的期望。

使用 clang 该代码无法编译。它会产生以下错误消息。

test.cpp:11:58: error: expected expression
template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
                                                         ^
test.cpp:14:59: error: expected expression
template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
                                                          ^
test.cpp:20:3: error: no matching function for call to 'f'
  f(foo {});
  ^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
     ^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
     ^
test.cpp:21:3: error: no matching function for call to 'f'
  f(int {});
  ^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
     ^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
     ^
4 errors generated.

应该编译吗?这两个编译器哪个有问题?


First and foremost, thanks to @Richard Smith https://stackoverflow.com/users/1041090/richard-smith on the #llvm IRC Channel on oftc http://llvm.org/docs/#irc for the explanation.
Unfortunately, this is not legal C++ and as such Clang is correct: {} is not an expression but a braced-init-list and as such will never be a constant expression as is needed in the initializer of a non-type template parameter.

§14.3.2 [temp.arg.non-type] p1

A 模板参数对于非类型、非模板模板参数应为以下之一:

  • 对于非类型模板参数整型或枚举类型,转换后的常量表达式(5.19) 的类型模板参数; or
  • [...]

一种解决方案是设置一个虚拟值enabler.

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

替换失败是否是依赖非类型模板参数的错误? 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐

  • 如何在 capnproto C++ 生成的代码中设置列表的字符串项?

    我有这样的 capnproto 定义 struct School name 0 Text address 1 Address foundation 2 Date emailAddresses 3 List Text 我想在构建器中使用与此类
  • JSLint:在定义错误之前使用函数

    我使用 JSLint 来验证我的大部分外部 Javascript 文件 但我得到的最大数量的错误来自于定义之前使用的函数 这真的是我应该担心的问题吗 看来 Firefox IE7 和 Chrome 并不关心 功能与流行的一样init 我经常
  • 时间延迟 Tkinter

    我想在 PyDev Eclipse python 2 75 中制作一个图形窗口 我做了一些事情 但我想做一个 入口 眨眼 它测试用户输入 如果它是一个整数 它应该闪烁绿色一秒钟 然后变成白色 但如果它是一串其他东西 它应该闪烁红色 然后变成
  • 如何制作分割文本输入占位符?

    我想要做的事情也许最好用图像来解释 我将在下面添加 但本质上它是文本inputHTML 字段一半是预先存在的值 另一半是可替换的 我尝试添加两个value and a placeholder场 然后通过将它们分开padding left在
  • python SyntaxError 与 dict(1=...), 但 {1:...} 有效

    Python 似乎在接受字典类型的键方面不一致 或者 换句话说 它允许以一种定义字典的方式使用某些类型的键 但不允许以其他方式使用 gt gt gt d 1 one 2 2 gt gt gt d 1 one gt gt gt e dict
  • UIHostingController 是否必须位于视图控制器层次结构中?

    我想在我的基于 UIKit 的 UI 中嵌入一些 SwiftUI 不幸的是 Apple 不提供UIHostingView only UIHostingController 我可以或多或少地忽略该控制器并只使用它的视图 还是我真的需要将它添加
  • Clojure 中 definterface 和 defprotocol 的区别

    除了缺少文档之外 还有什么区别definterface and defprotocol在 Clojure 中 根据Clojure 的乐趣 使用的优点definterface over defprotocol受到限制 完全是因为前者允许原始类
  • 在 Libgdx 中使用屏幕时重用代码

    根据我在阅读其他人关于如何制作不同屏幕的代码时的理解 您执行一个主处理程序类 然后为每个屏幕创建一个新类 让我困惑的是 每当你创建一个新屏幕时 你都必须重新定义将要渲染的所有内容 例如 SpriteBatch 精灵 字体等 有没有办法在所有
  • Scala:包导入冲突

    我正在导入一个隐式 scala concurrent ExecutionContext Implicits global 在此之前 我import global Analytics xyzMethod 其中 global 是我的包中的一个目
  • 如何将大型 xml 文件的一部分反序列化为 C# 类?

    我已经阅读了一些关于如何反序列化 xml 的帖子和文章 但仍然没有弄清楚应该如何编写代码来满足我的需求 所以 我为另一个关于反序列化 xml 的问题道歉 我有一个大 50 MB 的 xml 文件 需要反序列化 我使用 xsd exe 获取文
  • 如何将 Blender 3D 动画导入 iPhone OpenGL ES?

    我正在尝试使用 OpenGL ES 在 iPhone 上制作动画 我能够在 Blender 3D 软件中制作动画 我可以将 Blender 导出为 obj 文件到 OpenGL 并且它可以在 iPhone 上运行 但我无法将我的动画作品从
  • 辅助功能:仅使用带有 href="#" 的 javascript 链接

    我有一个 React SPA 其中有一些链接可以导航到其他页面或同一页面上的其他位置 这些导航要么以编程方式决定 要么依赖 javascript 转到同一页面上的另一个位置 我可能不知道链接href当显示链接时 所以我将其渲染为href a
  • 我们需要用 自己实现双缓冲吗?

    我开始使用 Canvas 带有 GWT 我们需要自己实现双缓冲吗 想知道浏览器是否已经以某种方式为我们实现了这一点 Thanks 您绝对不需要自己实现双缓冲 这样做会浪费时间和性能 对我们来说幸运的是 每个画布实现都会在幕后为您实现它 这是
  • 如何检查 Firebase 数据库值是否存在?

    我正在将实时数据库与 Google 的 Firebase 结合使用 并且尝试检查子项是否存在 我的数据库结构如下 root users james jake rooms room1 room 1 properties room2 room
  • 在 Python 中从图像中提取连接的对象

    我有一个graysacle png 图像 我想从图像中提取所有连接的组件 有些组件具有相同的强度 但我想为每个对象分配一个唯一的标签 这是我的图片 我尝试了这段代码 img imread images soccer cif str i zf
  • @EnableMongoAuditing 和 @CreatedDate 审核在 Spring Boot 2.4.3 中不起作用

    我正在关注这个例子https github com hantsy spring reactive sample blob master boot exception handler src main java com example dem
  • jquery地址怎么用呢?

    我试图了解如何使用 jQuery 地址插件来处理 ajax 的深度链接 但文档非常差 我找不到任何好的教程来解释正在发生的事情 我认为一个好的文档和好的例子对于每个插件都很重要 有人可以解释或提供一些有用的解释链接吗 address cha
  • codeigniter $this->upload->do_upload() = false

    我正在尝试上传文件 我选择一个文件然后提交它 但 this gt upload gt do upload 的结果始终为 false 这是我的表格
  • subprocess.Popen execve() arg 3 包含非字符串值

    我正在尝试通过 shell 运行另一个脚本 该脚本使用一组修改后的环境变量 def cgi call script environ pSCRIPT subprocess Popen script stdout subprocess PIPE
  • 替换失败是否是依赖非类型模板参数的错误?

    假设我有这些模板别名 enum class enabler template