使用概念是否允许在成员函数上使用 decltype

2023-12-19

我来到know https://stackoverflow.com/a/74024419一个班级的X具有名为的成员函数func,c++标准不允许我们写decltype(X::func)。因此我预计下面给出的程序会产生一个错误,类似于invalid use of non-static member function。但令我惊讶的是,该计划compiles https://godbolt.org/z/Ma67TTs5e与所有 3 个编译器一起使用。

#include <iostream>
#include <type_traits> 
#include <concepts>

template < typename T >
concept test = std::same_as <decltype(T::func), int(int) >;

struct D
{
    int func(int);
};

int main()
{ 
    std::cout << test<D>;      
}    

上述程序由所有 3 个编译器编译。通过查看 [expr.prim.id],程序似乎格式不正确,并且应该发出诊断信息。但没有一个编译器提供任何错误。那么,使用concept以程序中所示的方式使程序格式良好,还是仍然格式错误,并且所有编译器都错误吗?


按照程序中所示的方式使用概念是否使程序格式良好

该计划是格式良好的如下所述。来自[temp.constr.normal]:

表达式 E 的范式是一个约束 (13.5.2),定义如下:

  • 概念 ID C 的范式是约束表达式的范式 C的,将参数中的A1,A2,...,An替换为C各自的模板参数后 每个原子约束中的映射。如果任何此类替换导致无效的类型或表达式, 该程序格式不正确;无需诊断。

(强调我的)

注意最后一句的强调。特别是,它是关于参数映射。也就是说,如果参数映射导致类型无效,则只有程序是 IFNDR。

但在您给定的示例中,参数映射是T ->decltype(T::func)它本身并不是无效类型。因此,上述引用的参考文献并不满足。


现在,来自 [temp.constr.atomic#3]:

要确定是否满足原子约束,参数映射和模板实参首先被替换到其表达式中。 如果替换导致无效类型或表达式,则不满足约束。否则,如有必要,将执行左值到右值的转换,并且 E 应为 bool 类型的常量表达式。 当且仅当 E 的计算结果为真时,约束才被满足。 如果在程序的不同点,对于相同的原子约束和模板参数,满足结果不同,则该程序是格式错误的,不需要诊断。

(强调我的)

由于替换了模板参数D导致无效的构造decltype(D::func),给定的约束不满足(意味着它是false).


所有的编译器都错了吗?

因此,所有编译器都正确接受程序并输出0.

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

使用概念是否允许在成员函数上使用 decltype 的相关文章

随机推荐

  • 从 django 模板获取序列化的 json 对象?

    我需要澄清一下 例如 如果我使用序列化对象进行视图 def sample request res name man encoded json dumps res return render to response sample exampl
  • 输入“CREATE TABLE”时没有可行的替代方案

    我无法使用以下命令添加 MySQL 连接器 curl i X POST H Accept application json H Content Type application json localhost 8083 connectors
  • 隐式参数的有效用法

    下列example http www scala lang org node 114 from 斯卡拉之旅显示如何使用隐式根据类型提供适当的缺失成员 add 和 unit 编译器将在范围内选择正确的隐式对象 该库还使用它List sortB
  • gnuplot - 仅在图例/键中增加点的大小

    我有一个如下所示的图表 我想增加图例中点的大小 是图例还是关键 但不增加图中点的大小 图片中解释得更好 这能实现吗 首先不绘制增加符号大小的任何内容 然后绘制不带密钥的数据 gnuplot gt plot 1 0 ls 7 lw 6 wit
  • Python doctest 是否消除了单元测试的需要?

    我所在项目的一位开发人员同事认为文档测试与单元测试一样好 并且如果一段代码经过文档测试 则不需要进行单元测试 我不相信情况是这样 任何人都可以提供一些可靠的 理想引用的例子来支持或反对文档测试取代单元测试需求的论点吗 谢谢 丹尼尔 编辑 任
  • 如何在 C# windows 窗体中在可缩放图像上绘图

    所以我正在实现一个可以读取图像的项目 平移它 缩放它并做其他事情 一切都很顺利 直到我尝试用鼠标右键实现绘图 问题是当我画一条线时 图像上出现的线与我在屏幕上画的线不对应 这意味着它发生了移动 并且我知道它是因为图像的大小和缩放而改变的 但
  • WhatsApp 图像共享 iOS [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在开发一个 iOS 应用程序 我必须在其中从我的应用程序在 WhatsApp 上共享图像 我找到了这段代码 但它只处理文本共享https
  • 如何使用 MobileDevice 框架将文件写入我的应用程序的 Documents 目录?

    因此 我需要以编程方式将文件写入 iPhone 上的应用程序文档目录 由于许可证限制 我无法使用 libimobiledevice iphonedisk 不再维护 据我所知 无论如何您实际上都无法访问应用程序数据 所以我想我需要直接使用Mo
  • 使用 GridLayout 时可以将组件添加到特定网格单元吗?

    当我将 GridLayout 设置为 JPanel 然后添加一些内容时 它会按 文本顺序 从左到右 从上到下 顺序添加 但我想将一个元素添加到特定单元格 在第 j 列的第 i 行中 是否可以 不可以 您不能在特定单元格添加组件 您可以做的是
  • 如何从闭包表中以 HTML 形式显示树结构

    我在 MySQL 中存储一些分层数据 由于各种原因 我决定使用闭包表 而不是嵌套集 邻接表等 到目前为止 它对我来说效果很好 但现在我正在尝试弄清楚如何在 HTML 中实际显示这棵树 即使用正确的缩进 举个例子 假设我有一棵像这样的树 Fo
  • UnobservedTaskException - 任务从哪里来

    在我的 MVC 应用程序中 我有时会遇到如下异常 System Net WebException The request was aborted The request was canceled at System Net HttpWebR
  • 在主干中获取 /collection/id 而不加载整个集合

    有没有办法加载 Backbone 集合的单个实体 从服务器 Backbone Collection extend url rest product 下面的代码可以加载整个集合collection fetch 但如何加载单个模型呢 Backb
  • 当前线程方法java

    所以我正在尝试为我正在制作的游戏使用线程 我是very刚接触这个主题 所以我可能理解不正确 我的问题是 currentThread 方法在 java API 的 Thread 类中如何工作 API 说 返回对当前正在执行的线程对象的引用 但
  • T-SQL 算术溢出:哪一列?

    在MS SQL Server 2005中 当在INSERT期间遇到 将数字转换为数字类型的算术溢出错误 时 是否可以发现哪一列的输入值导致了错误 似乎有许多类似的转换错误 但没有报告哪一列引发了问题 这使得在大型查询中修复错误变得相当困难
  • IMPORTDATA 出现很多错误,因为我正在尝试加载许多单元格以获取股票报价

    我有一张包含 220 个 导入数据 功能的 Google 表格 其中每个功能都从网站上提取股票报价 功能很简单 importdata http
  • 在设置大量计时器或使用计划任务队列之间寻找解决方案

    我正在构建一项服务 游戏 其中一组用户将在一个房间中 它将在一定的持续时间 例如 30 秒 内通过每个用户做出选择 如果用户在该持续时间内没有做出选择 服务将自动为该用户生成一个选择 如果在持续时间结束之前做出选择 那么下一个用户就起来了
  • 如何阅读 VS Code 中的发行说明

    我今天重新启动了 VS Code 它已更新 当它再次打开时 我看到一个带有发行说明的选项卡 几分钟后决定打开我的项目以查看操作中的更改 然而 当我打开该项目时 发行说明选项卡已关闭 现在我找不到在 VS Code 中专门访问它的方法 有没有
  • 如何在delphi中一次将不同字体格式的文本绘制到画布上?

    我一直在使用DrawText满足我所有的 矩形文本 输出需求 但是我没有找到一种绘制字符串的方法 例如 将每个其他单词加粗或使用不同的颜色 或者更糟糕的是 为所述随机选择的单词使用不同的背景 据我所知 可能没有一个程序可以做到这一点 我可能
  • Android Spring Jackson 映射:NoClassDefFoundError

    我试图让我的 Android 应用程序作为 REST 客户端运行 基本上我遵循了这个例子 https github com SpringSource spring android samples tree master spring and
  • 使用概念是否允许在成员函数上使用 decltype

    我来到know https stackoverflow com a 74024419一个班级的X具有名为的成员函数func c 标准不允许我们写decltype X func 因此我预计下面给出的程序会产生一个错误 类似于invalid u