放弃 C++20 中显式函数模板特化的访问检查规则

2023-12-05

[温度规格]/6通过实现添加到 C++20P0692R1 (专业化访问检查) [emphasis mine]:

[温度规格]/6常用的访问检查规则不适用于声明中的名称显式实例化或明确的专业化,但出现在函数体、默认参数、基本子句、成员规范、枚举器列表或静态数据成员或变量模板初始值设定项中的名称除外。 [注:特别是,模板参数和名字在函数声明符中使用(包括参数类型、返回类型和异常规范)可能是私有类型或通常无法访问的对象。 ——尾注]

事实上,从 C++20 开始,这将使以下程序格式良好:

class A { class B {}; };

template<typename T> void foo() {};
template<> void foo<A::B>() {}

int main() {}

然而,海湾合作委员会(头 11.0.0 20201121; DEMO) 和 铿锵 (头 12.0.0; DEMO)拒绝上面的程序(对于-std=c++20/-std=c++2a),引用私人访问违规

GCC:

'class A::B' is private within this context

Clang:

error: 'B' is a private member of 'A'

GCC 列出已实施的 P0692R1:

  • GCC:GCC 中的 C++ 标准支持

而 Clang 将其 P0692R1 的实现列为Partial:

  • Clang 中的 C++ 支持:C++20 实现状态

Question

  • 这里 C++20 中的正确行为是什么,上面的程序是否格式良好(GCC bug / Clang 未完全实现)或者 GCC 和 Clang 是否正确拒绝它?

这里 C++20 中的正确行为是什么,上面的程序是否格式良好(GCC bug / Clang 未完全实现)或者 GCC 和 Clang 是否正确拒绝它?

正如OP中已经引用的那样,[temp.spec]/6支持此功能,并且该程序格式良好。特别是,下面的所有片段 (A) 到 (D) 都是格式正确的:

// (A)
class A { class B {}; };
 
template<typename T> struct S {};
template<> struct S<A::B> {};

// (B)
class A { class B {}; };
 
template<typename T> void foo() {};
template<> void foo<A::B>() {}
 
// (C)
class A { class B {}; };
 
template<typename T>
constexpr bool v = false;

template<>
constexpr bool v<A::B> = true;

// (D)
class A { class B {}; };

template<typename T, typename U> struct S {};
template<typename U> struct S<A::B, U> {};
template<typename T> struct S<T, A::B> {};

GCC is wrong to reject (B) and (C) (correctly accepts (A) and (D)), and Clang is wrong(1) to reject (B) through (D) (correctly accepts (A)).

错误报告:

  • 海湾合作委员会(已确认):[C++20][P0692R1] 函数和变量模板的显式特化声明不会放弃访问检查
  • Clang: [P0692R1] 函数和变量模板的显式特化声明不会免除访问检查

(1) Note that Clang (as highlighted in the OP) has marked the implementation status for P0692R1 as "Partial", so this may not be a Clang bug but rather a feature yet to be implemented C++2a/C++20.

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

放弃 C++20 中显式函数模板特化的访问检查规则 的相关文章

随机推荐

  • 通过相机使用动态坐标捕获图像

    我正在制作一个基于相机的应用程序 我在相机上放置了一个矩形视图 当我使用捕获图像时new Camera PictureCallback 我裁剪了该图像 以便它将获得矩形的一部分 嗯 它工作正常 现在我实施了View OnTouchListe
  • Laravel - 三个模型的数据透视表 - 如何插入相关模型?

    我有三个具有多对多关系的模型 User Activity Product 桌子看起来像id name 每个模型中都有函数 例如在用户模型中 public function activities return this gt belongsT
  • 使用 fetch 进行 WebAudio 流式传输:DOMException:无法解码音频数据

    我正在尝试使用 Chrome 51 播放来自 fetch API 的无限流 网络摄像头音频流为 Microsoft PCM 16 位 单声道 11025 Hz 该代码对于 mp3 文件几乎可以正常工作 除了一些小故障 但它对于 wav 文件
  • Java Set 获取重复条目

    JavaDoc 将集合定义为 不包含重复元素的集合 更正式地说 设置 不包含使得 e1 equals e2 的元素对 e1 和 e2 为了验证这一点 我创建了一个非常简单的程序 import java util HashSet public
  • 使用 CCHmac() 生成 HMAC swift sdk8.3

    在 SDK8 3 之前 我是通过这种方式生成 hmac 的 现在我在 CCHmac 函数上遇到错误 由于我是初学者 我不知道如何解决它 在此先感谢您的帮助 xcode 警告 无法使用类型为 UInt32 CChar UInt CChar U
  • 从 OBJ 文件导入时如何在 glTexCoordPointer 中设置/计算纹理缓冲区

    我正在 Android 中解析 OBJ 文件 我的目标是渲染和显示该对象 除了正确的纹理映射之外 一切都工作正常 将资源 图像导入 opengl 等工作正常 我不知道如何将 obj 文件中的纹理相关数据填充到纹理缓冲区对象中 在 OBJ 文
  • 如何读取无符号整型的特定位

    我有一个 uint8 t 我需要读 写特定位 我将如何去做这件事 具体来说 我的意思是 我需要写入一个值的前 7 位 然后读取另一个值的最后一位 编辑 忘记指定 我将把它们设置为大端 您正在寻找位掩码 学习如何使用 C 的按位运算符 等等都
  • 在 Windows 上规范化路径时,Java 是否需要支持 ERROR_NO_MORE_FILES?

    问题 一些用 Java 实现的守护进程在 Windows 7 上运行 将文件从一个目录复制到另一个目录 而源目录和目标目录都是 Windows Server 2016 托管的网络共享 复制是使用 Apache Commons IO 完成的
  • 对于非 ASCII 字符串,UrlHelper.IsLocalUrl 方法始终返回“false”

    我最近发现 UrlHelper IsLocalUrl方法总是返回false 如果它检测到非 ASCII 字符url范围 Example var isLocal UrlHelper IsLocalUrl false 这是一个错误 还是 设计使
  • 什么是“运行时”?

    我听说过 C Runtime Visual C 2008 Runtime NET Common Language Runtime 等 什么是 runtime 确切地 它是什么做的 它如何与我的代码交互 或者更准确地说 它是如何控制我的代码的
  • 如何在catch中打印错误

    catch let error as LocksmithError print error it would print the case of the error 但是如果我这样做 catch LocksmithError Duplica
  • 如何更改表格的字体大小

    我正在画一张桌子matplotlib axes Axes table像这样 sub axes table cellText table vals colWidths 0 15 0 25 rowLabels row labels loc ri
  • PubSub REST 订阅拉取未返回所有消息

    我们使用要拉取的 REST 服务 API来自 PubSub 订阅的消息 准备好接受服务的消息被确认 而其他消息则在稍后的执行周期中未被确认而需要接受服务 在执行周期中 我们发送一个single请求给pull服务 REST API with
  • SPARQL 过滤器语言(如果可能)在多值上下文中

    考虑以下来自 GeoNames 数据库的摘录 prefix gn
  • 适用于 iPhone 的地理空间库

    我正在考虑创建一个位置感知 iPhone 应用程序 该应用程序可以通过与兴趣点 POI 列表打包来离线工作 该应用程序将从中读取用户的当前位置CoreLocation并按照距用户当前位置的远近顺序生成 POI 列表 我需要两个基本的地理空间
  • ImageView 拒绝父级的圆角和边框

    我有一个有多个孩子的视图 我想给整个组圆角 如下所示 我试图通过给父 LinearLayout 及其 ImageView 通过背景提供圆角来做到这一点 LinearLayout 和子级
  • 在 Swift 4 中从 InputStream 中准确读取 n 个字节

    我有一个通过 TCP 向我发送消息的服务器 其中前 4 个字节确定消息其余部分的长度 所以我需要 1 将4个字节读入UInt32 有效 并将其存储到预期字节数 2 read 预期字节数字节到message 现在我的代码如下所示 privat
  • 部分细胞进料负载

    各位新年快乐 目前 我正在使用以下默认方式访问和加载 Google 表格工作表 URL metafeedUrl new URL SPREADSHEET URL SpreadsheetEntry spreadsheet service get
  • 单元测试和检查私有变量值

    我正在使用 C NUnit 和 Rhino Mocks 编写单元测试 以下是我正在测试的课程的相关部分 public class ClassToBeTested private IList insertItems new List publ
  • 放弃 C++20 中显式函数模板特化的访问检查规则

    温度规格 6通过实现添加到 C 20P0692R1 专业化访问检查 emphasis mine 温度规格 6常用的访问检查规则不适用于声明中的名称显式实例化或明确的专业化 但出现在函数体 默认参数 基本子句 成员规范 枚举器列表或静态数据成