友元模板特化声明中不允许使用 Constexpr 吗?

2024-06-21

我正在移植 C++14-constexpr代码库从 Clang 到最新的 g++-5.1。考虑以下本土开发的简化代码片段bitset自 Clang 3.3 的太平岁月以来(现在已经快 2 年了!),该类就一直可以正确编译。

#include <cstddef>

template<std::size_t>
class bitset;

template<std::size_t N>
constexpr bool operator==(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;

template<std::size_t N>
class bitset
{
    friend constexpr bool operator== <>(const bitset<N>&, const bitset<N>&) noexcept;
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- error from this piece
};

template<std::size_t N>
constexpr bool operator==(const bitset<N>& /* lhs */, const bitset<N>& /* rhs */) noexcept
{
    return true;
}

int main() {}

实例 http://melpon.org/wandbox/permlink/EVdayJ5tzkp0Y9v7在Wandbox上。然而,g++-5.1和当前的主干版本给出了一个错误:

友元模板声明中不允许使用“constexpr” 专业化

Question:这是一个已知的 g++ bug 还是 Clang 不符合最新标准?

Note: 上面只使用了C++11风格constexpr功能,因为内部没有进行任何修改operator==,所以模板、朋友和 constexpr 之间似乎存在一些奇怪的干扰。

UPDATE: 归档为错误 65977 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65977关于 Bugzilla。


GCC在这里是错误的。

所有引用均针对最新的 C++ WD N4431。

[tl;dr:函数之间是有区别的inline(或者更准确地说,成为内联函数,如 7.1.2/2 中定义)并用inline说明符。这constexpr说明符使函数内联,但不是inline说明符。]

说明符在 C++ 标准的第 7.1 条中进行了描述,并且是语法的一个元素。因此,每当标准谈到foo说明符出现在某处,这意味着说明符确实出现在源代码(的解析树)中。这inline说明符是一个函数说明符,如第 7.1.2 节所述,其作用是使函数成为内联函数。 (7.1.2)/2:

带有一个函数声明(8.3.5、9.3、11.3)inline说明符声明一个内联函数.

还有另外两种方法可以声明内联函数,而不使用inline说明符。 (7.1.2)/3 中描述了其中之一:

在类定义中定义的函数是内联函数。

另一个在(7.1.5)/1中描述:

constexpr 函数和 constexpr 构造函数是隐式的 内联(7.1.2)。

这些都没有说这种行为就像inline 说明符存在,只是该函数是内联函数。

那么为什么会有这个规则呢?

(7.1.2)/3 中有该规则的更简单形式:

If the inline说明符用在友元声明中,该声明应是定义,或者该函数应事先已内联声明。

这样做的目的是允许在大多数情况下忽略友元声明——不允许它们向友元实体添加“新信息”,除非在定义友元函数的特殊情况下。 (这反过来又允许实现延迟解析类定义,直到“需要”为止。)因此,我们在 (8.3.6)/4 中也看到:

如果友元声明指定默认参数表达式,则该声明应是定义,并且应是翻译单元中函数或函数模板的唯一声明。

这同样适用于函数模板的友元特化的声明:如果它可以添加额外的信息,那么实现就不能延迟解析类定义。

现在,请注意这个基本原理确实not适用于constexpr:如果constexpr说明符出现在函数的任何声明上,它必须出现在every声明,按照 (7.1.5)/1。由于这里没有“新信息”,因此不需要限制。

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

友元模板特化声明中不允许使用 Constexpr 吗? 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • 使用 CSS Flexbox 堆叠图像

    我正在学习使用CSSflexbox 和我想在左侧渲染一个大图像 并在彼此之上渲染两个小图像 我怎样才能使用CSS弹性盒 div class container img class image1 src alt null img class
  • 在 Solr 中搜索确切的短语时,有没有办法包含停用词?

    我希望排除停用词 除非搜索词位于双引号内 例如 就像那样 也应该搜索 那个 这可能吗 这取决于您正在查询的字段的配置 如果索引分析器的配置包含 StopFilterFactory 则停用词根本不会被索引 因此您以后无法查询它们 但由于 So
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • 为什么我不能使用“exclude”从 python 轮子中排除“tests”目录?

    考虑以下包结构 与以下setup py内容 from setuptools import setup find packages setup name dfl client packages find packages exclude te
  • 访问WCF服务时触发MaxClockSkew

    我有一项 WCF 服务 其一个端点的 MaxClockSkew 配置设置为 23 59 59 但没有安全行为 另一个端点具有相同的 MaxClockSkew 配置和安全配置 问题是当访问非安全端点时不会引发异常 而当访问安全端点时会引发安全
  • 如何重命名现有的 Hybris 扩展

    我正在开发 Hybris 并使用 hybris 命令 ant extgen 和默认设置生成了一个新的扩展 在扩展生成过程中 我没有更改默认值 就像我让项目名称为 training 一样 我开始开发一些代码只是为了尝试 但现在我编写了相当多的
  • C++成员函数的多个非静态回调

    我发现使用下面链接的答案中的代码效果很好 但在我的用例中存在问题 它有效地为非静态成员函数创建一个 静态包装器 以作为回调传递 include
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件 我想到的第一个解决方案是使用find管道与xargs grep find iname py xargs grep e YOUR PATTERN 但是 如果我需要查找跨越多行的模式 我就会陷入困境 因为
  • AbstractCollection 的 toArray 方法的实现中的代码有什么用

    public Object toArray Estimate size of array be prepared to see more or fewer elements Object r new Object size Iterator
  • 将 ArrayList 保存在捆绑包 savingInstanceState 中

    ArrayList 是在类级别定义的 这些是我保存的实例方法 Override protected void onSaveInstanceState Bundle outState super onSaveInstanceState out
  • 添加 Imap 文件夹 Mailkit

    我尝试使用 Mailkit 添加顶级文件夹 因此当我添加以下标签时 我可以将它们分组到该文件夹 下 标签是 邮件包 档案 邮件包 标记 我想创建一个名为 mailkit 的文件夹 以便 gmail 将它们分组 但目前我似乎无法找到执行此操作
  • Python Nose 导入错误

    我似乎无法理解鼻子测试框架 https nose readthedocs org en latest 识别文件结构中测试脚本下方的模块 我已经设置了演示该问题的最简单的示例 下面我会解释一下 这是包文件结构 init py foo py t
  • 检查对象的每个属性是否为空

    我的课程具有多个属性 public class Employee public string TYPE get set public int SOURCE ID get set public string FIRST NAME get se
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • Android Studio——清除Instrumentation Test的应用程序数据

    如何让 Android Studio AndroidJunitRunner 在仪器测试之前清除应用程序数据而无需手动运行adb命令 我发现android support test runner AndroidJUnitRunner有点作弊
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 友元模板特化声明中不允许使用 Constexpr 吗?

    我正在移植 C 14 constexpr代码库从 Clang 到最新的 g 5 1 考虑以下本土开发的简化代码片段bitset自 Clang 3 3 的太平岁月以来 现在已经快 2 年了 该类就一直可以正确编译 include