函数模板的非依赖默认模板参数是否允许 SFINAE?

2024-01-22

这里的“不依赖”是指“不依赖于该特定函数模板的任何其他模板参数”。

回答的同时这个问题 https://stackoverflow.com/q/15232758/500104,我以为我找到了答案,但根据@Johannes(在我的答案的评论中),我误解了这里的标准。举个简单的例子:

#include <type_traits>

template<class T>
struct X{
  template<class U = typename T::type>
  static void foo(int){}
  static void foo(...){}
};

int main(){
  X<std::enable_if<false>>::foo(0);
}

(现场版。 http://liveworkspace.org/code/2hMZJv)

是否能保证上述内容能够编译?GCC 和 Clang 在这里存在分歧,正如在实时版本中在它们之间切换时可以看到的那样。但有趣的是,GCC 接受以下内容:

#include <type_traits>

template<class T>
struct X{
  template<bool = T::f()>
  static void foo(int){}
  static void foo(...){}
};

struct Y{
  static bool f(){ return true; }
};

int main(){
  X<Y>::foo(0);
}

(现场版。 http://liveworkspace.org/code/45Q6eT)

第二个片段只会打印foo(int) if T包含一个constexpr静态函数f。有趣的是,如果你完全删除f from Y(或者通过,比如说,int相反),GCC 抱怨缺少一个成员,表明它不允许 SFINAE - 这与之前的观察相矛盾。 Clang 接受所有变体并应用 SFINAE,我想知道这是否是标准所保证的。

(FWIW,具有 Nov CTP 的 MSVC 通常与 Clang 一致,但如果该函数存在,则在第二个片段上崩溃,可能是因为它们没有constexpr。我提交了错误报告here https://connect.microsoft.com/VisualStudio/feedback/details/780779/.)


我认为有问题的代码是不正确的,因为当实例化类模板时,所有成员声明都被实例化,除了定义部分和默认参数成员函数和成员函数模板。该标准还定义了函数默认参数何时被精确实例化。

So 默认模板参数立即被实例化。的可能性是默认参数可能旨在包括默认模板参数在我看来,此时的值非常小,因为没有描述稍后何时实例化这样的参数。

这符合以下要求“默认模板参数不得在出现在成员类之外的类模板成员定义的模板参数列表中指定。”,因为在实例化周围的类模板时无法立即实例化这样的模板参数。

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

函数模板的非依赖默认模板参数是否允许 SFINAE? 的相关文章

随机推荐

  • 设置 AnchoredOffsetbox 的线宽和面颜色?

    是否可以更改 AnchoredOffsetbox 的线宽 面颜色等 我用它来列出我的图旁边的一些变量 例如 A 1 B 2 以这种方式 垂直对齐 所以它有点像一个额外的图例 但句柄也是文本 但我不知道如何像图例那样设置框架的属性 非常感谢任
  • 动态更改 Quill 占位符

    我知道在实例化 Quill 编辑器时 有一个占位符选项 有没有一种方法可以在实例化编辑器后动态更改此占位符 占位符是通过 CSS 规则实现的 ql editor before content attr data placeholder 所以
  • 如何在别名列上使用聚合函数 SUM?

    Invoice ID PO Number and dueDate are shown in duplicates TotalPrice 是一个别名 应该是单价 总价是一个错误 所以假设是单价而不是总价 TotalShippingPrice
  • JSON.net 与 XPATH:如何保留 SelectToken 中的节点顺序?

    XPath 2 规定应按照文档中的顺序返回选择的节点顺序 当您在 JSON Net 中 SelectTokens JSONPath 时 情况似乎并非如此 当我处理以下文档时 string json Files dir1 Files file
  • 文件版本信息和程序集信息

    给出 Blah dll 的 AssemblyInfo cs 中的这段代码 assembly AssemblyVersion 3 3 3 3 assembly AssemblyFileVersion 2 2 2 2 然后在一个单独的 exe中
  • 如何将字符串转换为HashMap? [复制]

    这个问题在这里已经有答案了 我有一个 Java 属性文件 并且有一个KEY as ORDER 所以我检索VALUE那个KEY使用getProperty 加载属性文件后的方法如下 String s prop getProperty ORDER
  • Java 8 Javascript 引擎向后兼容性

    我正在我的项目中尝试 Java 8 但遇到了与构建过程相关的错误 我正在使用 ANT 脚本 有时我会使用一些 javascript 嵌入到 ANT 中 来执行一些构建特定的操作 导致错误的脚本部分如下所示 该项目使用 Java 7 或 Ja
  • Cygwin 上的 C 编译器生成什么?

    根据下面的 recognize compilers sh 脚本的输出 Cygwin 上似乎可以使用以下 C 编译器 那些标记为 Cygwin 的要求 cygwin1 dll 文件可用 pc 和 w64 编译器有什么区别 为什么没有 x86
  • C++20 std::ranges:范围适配器跳过每个第 n 个元素

    我正在尝试更熟悉 C 20std ranges我遇到了一个看似简单的问题 如果不滚动我自己的实现 我无法找到标准解决方案 问题很简单 我只想访问和处理使用 C 20 范围适配器的范围中的每个第 N 个元素 例如 我正在寻找一个实用程序 其中
  • 从一个文件访问另一个文件中的类实例?

    我有两个文件 都在同一个项目中 网络抓取框架的一部分 File1 处理 File2 生成的项目 在 File2 中 我有一个函数可以打印出有关进程的一些基本统计信息 已生成的项目数等 我在 File1 中有计数 我想使用 File1 中的统
  • Qt 库中的 GUI 线程检测

    我需要知道我的函数在哪个线程的上下文中运行 是主 GUI 线程还是某个工作线程 我无法使用简单的解决方案将 QThread 指针存储在主函数中并将其与 QThread currentThread 进行比较 因为我正在编写一个库并且无权访问主
  • php通过字符串名称调用类函数

    如何通过名称调用普通 非静态 类函数 下面给出了一个错误 指出 param 1 需要是一个有效的回调 我不希望该函数是静态的 我希望它是一个普通的函数 并且到目前为止我看到的所有示例都将它们设为静态 class Player public
  • Dagger 2 组件中的 getter 方法的用途是什么?

    我正在尝试了解 Dagger 2 中的组件 这是一个示例 Component modules MyModule class public interface MyComponent void inject InjectionSite inj
  • SingleOutputStreamOperator#returns(TypeHint typeHint) 方法的 javadoc

    我正在阅读源代码SingleOutputStreamOperator returns 它的javadoc是 Adds a type information hint about the return type of this operato
  • Objective-C 中#import 和#include 有什么区别?

    Objective C 中 import 和 include 之间有什么区别 有时您应该使用其中之一而不是另一个 是否已弃用 我正在阅读以下教程 http www otierney net objective c html preamble
  • org.jooq.exception.DataAccessException:不支持的 Unicode 转义序列 \u0000

    我正在尝试使用 jOOQ 将序列化的 JSON 插入 Postgres JSONB 列 但它失败了 因为序列化的 JSON 有一个 0在它里面 jOOQ 有没有办法自动为我们逃脱这个问题 这是我得到的异常 org jooq exceptio
  • 使用核心音频实现后处理低通滤波器

    我已经使用基于时间的值实现了一个基本的低通滤波器 这没问题 但是尝试找到正确的时间片是猜测工作 并且会根据不同的输入音频文件给出不同的结果 这是我现在所拥有的 void processDataWithInBuffer const int16
  • 创建阴影 jar 时出错:null:IllegalArgumentException

    我在项目中使用 ASM 6 1 动态生成类文件 但是我在组装胖罐子时遇到了问题 ERROR Failed to execute goal org apache maven plugins maven shade plugin 2 4 3 s
  • Delphi 中如何将接口转换为对象

    在delphi 2009中我引用了IInterface我想将其投射到底层TObject Using TObject IInterface 显然在 Delphi 2009 中不起作用 尽管它应该在 Delphi 2010 中起作用 我的搜索引
  • 函数模板的非依赖默认模板参数是否允许 SFINAE?

    这里的 不依赖 是指 不依赖于该特定函数模板的任何其他模板参数 回答的同时这个问题 https stackoverflow com q 15232758 500104 我以为我找到了答案 但根据 Johannes 在我的答案的评论中 我误解