C++20 标准对于将主题用作模板非类型参数有何规定?

2023-11-22

The "模板非类型参数”文章“模板参数和模板参数”的段落指出:

唯一的例外是引用的非类型模板参数 或指针类型以及引用或指针的非静态数据成员 输入类类型及其子对象的非类型模板参数 (C++20 起) 不能引用/成为以下地址

  • 临时对象(包括在引用初始化期间创建的临时对象);
  • 字符串文字;
  • 的结果typeid;
  • 预定义变量__func__;
  • or a 子对象(包括非静态类成员、基子对象或数组元素)上述之一 (C++20 起).

重点是我的。

下面有一个例子

template<int* p> class X {};
int a[10];
struct S
{
    int m;
    static int s;
} s;

X<&a[2]> x3;  // error: address of array element
X<&s.m> x4;   // error: address of non-static member
X<&s.s> x5;   // ok: address of static member
X<&S::s> x6;  // ok: address of static member

根据引用的陈述,带有该词的行error注释中的内容应该可以由支持 c++20 的 c++ 编译器编译,因为a[2] and s.m既不是临时对象,也不是字符串文字,也不是typeid也不是预定义变量__func__也不是上述之一的子对象。事实上,gcc 11.1 编译了code没有错误,但是 clang 12.0.0 编译了code有错误。

此外,草案 N4835在第 13.4.2 段中声明以下内容

非类型模板参数的模板参数应转换为 模板参数类型的常量表达式 (7.7)。为一个 引用或指针类型的非类型模板参数,或者对于每个 引用或指针类型的非静态数据成员 类类型或其子对象的非类型模板参数, 引用或指针值不得引用或成为以下地址 (分别):

  • a 子对象(6.7.2),
  • 临时对象(6.7.7),
  • 字符串文字 (5.13.5),—(2.4)a 的结果typeid表达式(7.6.1.7),或
  • 一个预定义的__func__变量(9.5.1)。

并包含提到的示例。再次强调是我的。

考虑到这个草案,clang 可以正常工作,而 gcc 则不能,因为a[2] and s.m是子对象。

深层发掘。这草案 N4878第 13.4.3 段包含以下文字

对于引用或指针类型的非类型模板参数,或者对于 非类型中引用或指针类型的每个非静态数据成员 类类型或其子对象的模板参数,引用 或指针值不得引用或为地址 (分别):

  • 临时对象(6.7.7),
  • 字符串文字对象 (5.13.5),
  • 的结果typeid表达式(7.6.1.8),
  • 一个预定义的__func__变量(9.5.1),或
  • 上述之一的子对象 (6.7.2)。

并且不包含示例。

本主题开头引用的文本对应于草案 N4878,因此 gcc 可以正常工作,而 clang 则不能。

什么是C++20关于使用主题作为模板非类型参数的标准说法?哪个编译器符合标准?


措辞发生了变化,作为P1907R1,它被采纳为 C++20 的一部分。请注意,您引用的初稿 -N4835- 早于本次通过(该草案于 2019 年 10 月发布,本文于次月在 2019 年 11 月的贝尔法斯特会议上通过)。最接近 C++20 的草案是N4861,您也可以方便地在其中查看html表格.

结果如下:

template<int* p> class X {};
int a[10];
struct S
{
    int m;
    static int s;
} s;

X<&a[2]> x3;
X<&s.m> x4;

是一个有效的 C++20 程序,因为两者都不是a[2] nor s.m是以下任一对象的子对象:临时对象、字符串文字、a 的结果typeid表达式,或__func__.


cppreference 示例已更新以反映这一点,其中注释现在如下:

X<&a[2]> x3;  // error (until C++20): address of array element
X<&s.m> x4;   // error (until C++20): address of non-static member
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++20 标准对于将主题用作模板非类型参数有何规定? 的相关文章

随机推荐

  • 从 C# 将二进制数据插入 SQL,无需存储过程

    有谁知道是否可以在不使用存储过程的情况下从 C 将二进制数据插入 SQL 字段 例如 将字节数组转换为 base64 或类似的东西 然后使用如下所示的文本命令 String Format update A set B 0 where C D
  • 在 ASP.NET 中使用依赖注入和工厂模式传递服务

    我正在使用 ASP NET Core 我知道框架已经提供了这样的日志记录机制 但用这个来说明我的问题 我正在使用工厂模式来构建 Logger 类 因为我不知道日志记录的类型 因为它存储在数据库中 ILogger 合约 Log string
  • 以编程方式将 Excel 2003 文件转换为 2007+

    我正在寻找一种方法 基本上获取 2003 年旧文件扩展名 xls 的 excel 文件文件夹 并将它们转换为 xlsm 我知道你可以自己进入Excel表并手动完成 但是有没有办法用代码来完成呢 具体使用任何类型的库 这不是我的代码 但我以前
  • SQL 按日期范围内的频率进行分组

    我需要编写一个存储过程 它接受开始日期 结束日期和频率 日 周 月 季度 年 并根据这些参数输出结果集 显然 简单的部分是按日期范围查询 但是如何按频率分组呢 因此 如果有一组像这样的原始数据 Date Count 11 15 2011 6
  • SonarQube 6.1:如何在没有仪表板的情况下查看随时间的变化?

    SonarQube 曾经有仪表板 可以非常方便地显示指标如何随时间变化 甚至还有一个名为 时间机器 的仪表板 如何在 SonarQube 6 1 中查看此类信息 我很欣赏对 泄漏期 的新关注 但这并不是我关心的全部 转到项目的 度量 空间并
  • LibUsbDotNet 调用 UsbDevice.AllDevices 时未找到设备

    我正在执行 LibUsbDotNet 的示例代码 它将返回所有连接的 USB 设备的信息 您可以在下面找到此代码 using System using LibUsbDotNet using LibUsbDotNet Info using L
  • 尝试在 Windows 上重定向 stdout 和 stderr - _fileno(stdout) 返回 -2

    这是我的第一个问题 我即将将一些运行良好的 C 代码从 UNIX 移植到 Windows 它通过管道将 stdout 和 stderr 重定向到自定义 GUI 组件 我需要它来显示来自第三方库的反馈 该第三方库仅将消息输出到 GUI 上的标
  • 在C python中,访问字节码评估堆栈

    给定一个 C Python 帧指针 如何查看任意计算堆栈条目 一些特定的堆栈条目可以通过locals 我说的是其他堆栈条目 我不久前问了一个更广泛的问题 获取 C python exec 参数字符串或访问计算堆栈 但在这里我想重点关注能够在
  • 使用多语句 lambda 进行返回类型推导

    我一直在编写代码 最近发现 g 不会警告我某一类问题 根据 C 11 5 1 2 4 如果您的 lambda 不是单个返回语句 则返回类型必须声明为尾随返回类型或为 void 尽管 g 允许编译无效代码 如果它足够有意义 但有没有办法关闭此
  • 使用 SSIS 加载多个表并保持外键关系

    我正在尝试使用 SSIS 将单个文件 包含数百万条记录 中的数据加载到 SQL Server 上的多个表中 同时维护文件中定义的关系 为了更好地举例说明 假设我正在尝试加载一个文件 其中包含员工姓名 他们过去占用的办公室以及由选项卡分隔的职
  • Python Numpy 中的数组和 __rmul__ 运算符

    在一个项目中 我创建了一个类 我需要这个新类和一个真实矩阵之间的操作 所以我重载了 rmul 像这样的功能 class foo object aarg 0 def init self self aarg 1 def rmul self A
  • 如何在图像上绘制带有轮廓的文本?

    我一直在搜索和寻找在图像上绘制带有轮廓的文本 这是我的代码 private static void tulisnamafile string imagepath string textnya Image image Image FromSt
  • WinRT StorageFile 写入下载的文件

    我正在努力解决一个简单的问题 我想使用以下代码从网络下载图像 WebRequest requestPic WebRequest Create http something com id jpg WebResponse responsePic
  • preg_match:仅数字字母和逗号

    如何编写仅匹配数字字母和逗号的正则表达式 我想出了下面这个 但它不起作用 它也接受其他标点符号 check for matches number alphabets and commas only if preg match a zA Z0
  • 由于环境变量(HP笔记本电脑),delphi XE2无法在我的计算机上编译任何项目

    我有一台 HP 笔记本电脑 并且在 HP 笔记本电脑上安装了 delphi xe2 过去 5 个月前我使用 delphi 没有任何问题 但现在我收到此错误消息 DCC Error E1026 File not found FMX Filte
  • 订阅中的 Angular 订阅

    我有以下由多个订阅组成的代码 我需要实现的目标是这样的 订阅activatedRoute以获取用户和产品数据 返回商品数据后 使用商品数据订阅getSeller服务 使用返回的卖家数据订阅 getRating 服务 我的问题 有没有更好的方
  • Lua 5.2 中的沙箱

    我正在学习Roberto Ierusalimschy的 Programing in Lua 我发现书中的Sandboxing示例使用了该函数setfenv 改变给定函数的环境 但是在 lua 5 2 中这个函数不再可用 我尝试将文件 配置文
  • WPF DataGrid:如何将列设置为 TextWrap?

    我不确定为什么我的代码没有正确执行 TextWrapping 它不会包装 描述 列的文本 这正是我想要的 它只是将其切断 甚至没有使用 来让我知道还有更多数据 我尝试使用在网上找到的代码来完成这项工作 但没有成功 理想情况下 我希望能够仅将
  • 通过XPath提取属性节点的值

    如何通过 XPath 提取属性节点的值 示例 XML 文件是
  • C++20 标准对于将主题用作模板非类型参数有何规定?

    The 模板非类型参数 文章 模板参数和模板参数 的段落指出 唯一的例外是引用的非类型模板参数 或指针类型以及引用或指针的非静态数据成员 输入类类型及其子对象的非类型模板参数 C 20 起 不能引用 成为以下地址 临时对象 包括在引用初始化