为什么分解声明不能是 constexpr?

2023-12-20

请考虑以下代码片段来测试即将推出的 C++17 功能分解声明(以前称为结构化绑定)

#include <cassert>
#include <utility>

constexpr auto divmod(int n, int d)
{
    return std::make_pair(n / d, n % d); // in g++7, also just std::pair{n/d, n%d}
}

int main()
{
    constexpr auto [q, r] = divmod(10, 3);
    static_assert(q == 3 && r ==1);
}

这在 g++7-SVN 和 clang-4.0-SVN 上均失败,并显示以下消息:

分解声明不能声明为“constexpr”

丢弃constexpr定义并更改为常规assert()适用于两种编译器。

关于此功能的 WG21 论文均未提及constexpr关键字,既不是肯定的也不是否定的。

Question:为什么不允许分解声明constexpr? (除了“因为标准是这么说的”)。


问题:为什么不允许分解声明为 constexpr? (除了“因为标准是这么说的”)。

没有其他原因。标准在[dcl.dcl] p8中说:

The 声明说明符序列应仅包含类型说明符 auto(7.1.7.4) 和简历限定符.

这意味着它不能用以下方式声明constexpr.

这是国家机构对 C++17 CD 评论的主题,请参阅 US-95P0488R0 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0488r0.pdf:

Comment: 没有明显的分解原因 声明不能声明为静态, thread_local 或 constexpr。
提议的改变:允许 constexpr、static 和 thread_local 允许的集合声明说明符.

GB 16 和 GB 17 的注释也相关。

经过演进工作组在 2016 年 11 月会议上的审查后,这些评论在 C++17 中被拒绝。目前尚不清楚某些存储类在结构化绑定声明中意味着什么,以及如何更改规范以允许constexpr(仅仅在语法中允许它并不能说明它的含义)。要求发表一篇探索设计空间的论文。将来应该可以在不破坏任何代码的情况下更改此设置,但没有时间为 C++17 执行此操作。

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

为什么分解声明不能是 constexpr? 的相关文章

随机推荐

  • FastAPI 依赖项(yield):如何手动调用它们?

    FastAPI 使用 Depends 注入返回或产生的变量 例如 快速API SQL https fastapi tiangolo com tutorial sql databases h sqlalchemy main fastapi a
  • 如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?

    我想在我的 JSF 应用程序中上传一个文件 我正在使用一个Filter and HttpServletRequestWrapper访问上传 文件 public MultipartRequestWrapper HttpServletReque
  • 没有路由与 rspec 的匿名控制器匹配

    根据我的理解规格规格 http relishapp com rspec rspec rails v 2 1 dir controller specs anonymous controller 我希望下面的例子能够通过 describe Ap
  • 与 Java 相比,使用 Mono 的主要好处是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Oracle 中存储波形

    我正在设计一个新的实验室数据库 我想将所有测试的原始结果存储在一起 然而 结果可以是单个测量或原始波形 转发见页脚 下面哪种情况是理想的 以及为什么 或提供您自己的理想选择 TEST test id other TEST fields 选项
  • PHP中如何获取对象的受保护属性

    我有一个对象具有一些我想要获取和设置的受保护属性 该物体看起来像 Fields Form Element Location Object helper gt formText allowEmpty protected gt 1 autoIn
  • TypeScript 中扩展接口和相交接口之间的区别?

    假设定义了以下类型 interface Shape color string 现在 考虑以下方法来向此类型添加其他属性 扩大 interface Square extends Shape sideLength number 路口 type
  • 保存多语言数据的最佳数据库结构是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 多语言数据库的架构 https stackoverflow com questions 316780 schema for a multilanguage database 这是一个例子 produc
  • 同时获取多个 URL?

    我正在寻找一种同时获取多个 URL 的方法 据我所知 API 只能通过单个产品查找来检索我想要的数据 因此我需要使用 url 结构 products productID 一次获取多个产品 注意 这是在 VUEJS 中 这是我的代码到目前为止
  • argparse:如何配置多项选择、多个值、可选参数?

    我正在尝试设置一个参数 该参数接受给定选项列表中的一个或多个值 但这不是强制性的 我正在尝试这个 有几个变体也无法按预期工作 parser add argument FLAGS nargs choices X Y Z ALL 我希望从选择列
  • 浏览器显示 � 而不是 ´

    我有一个 PHP 文件 其中包含以下文本 div class small italic This is what you ll use div 在一台服务器上 它显示为 This is what you ll use 另一方面 如 This
  • 如何在 PHP 中创建和解析标签、长度、值 (TLV) 并将其编码为 Base64

    政府出台了一项新规定 要求所有增值税注册公司在新电子发票中使用二维码 QR 码字段应采用标签长度值 TLV 格式进行编码 标签值在相邻表的 标签 列中指定 TLV编码应如下 Tag 前面提到的以一个字节存储的标签值 长度 字段值进行UTF8
  • 参考类成员的琐碎性

    假设 出于我自己的原因 我希望一个类有一个非静态引用成员 我认为这种类型应该很容易从使用它的大多数代码中进行优化 因此 我在单元测试中断言其琐碎性 Clang 和 GCC 都认为该类很琐碎 但 MSVC 不同意 根据标准 谁是对的 为什么
  • (字符串:AnyObject)没有名为“下标”的成员

    我已经遇到过类似的问题 但仍然不明白为什么我的代码会抛出错误 var dict String AnyObject dict participants foo bar dict participants 0 baz 错误在第3行 String
  • 更改 VGG16 应用程序的输入张量形状

    我想将形状为 160 320 3 的图像提供给 VGG16 input tensor input tensor include top False 如何包含一个将图像重塑为 VGG16 模型预期形状的层 即 224 224 3 VGG16模
  • Bower 通话被公司代理拦截

    我正在尝试将 Bower 用于网络应用程序 但发现自己遇到了某种代理问题 D gt bower search jquery bower retry Request to https bower herokuapp com packages
  • Oracle 数据库 - ORA-01460 - 请求的转换未实现或不合理

    我收到一条错误消息 使用以下代码请求未实现或不合理的转换 OdbcConnection oConn new OdbcConnection oConn ConnectionString Driver Oracle ODBC Driver Da
  • 如何向 UITextView 添加双击手势

    目前我想让 UITextView 有双击手势 看来 UITableView 有自己的双击手势 当我们双击时 会选择一些文本 所以我想将这个默认的双击手势删除到我自己的手势识别器中 我尝试了很多方法 但都失败了 似乎没有办法删除 UIText
  • 存储指针值

    据我所知 当指针传递给函数时 它只是真实指针的副本 现在 我希望更改真正的指针 而不必从函数返回指针 例如 int ptr void allocateMemory int pointer pointer malloc sizeof int
  • 为什么分解声明不能是 constexpr?

    请考虑以下代码片段来测试即将推出的 C 17 功能分解声明 以前称为结构化绑定 include