当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么分解声明不能成为constexpr?》经验,为你挑选了1个好方法。

考虑以下片段来测试即将发布的C++ 17特性分解声明(以前称为结构化绑定)

#include 
#include 

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均未提及关键字,无论是正面还是负面.

问题:为什么不允许分解声明constexpr?(除了"因为标准这么说").



1> Jonathan Wak..:

问题:为什么不允许分解声明为constexpr?(除了"因为标准这么说").

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

所述DECL说明符-SEQ应只包含类型说明符 auto(7.1.7.4)和CV-限定符.

这意味着它无法声明constexpr.

这是国家机构对C++ 17 CD的评论的主题,参见P0488R0中的 US-95 :

注释:没有明显的理由说明为什么不能将分解声明声明为static,thread_local或constexpr.
建议的更改:允许constexpr,static和thread_local到允许的decl-specifiers集合.

评论GB 16和GB 17也有关系.

这些评论在2016年11月会议上由Evolution工作组审核后被C++ 17拒绝.目前还不清楚某些存储类对结构化绑定声明的意义,以及如何更改规范以允许constexpr(只是在语法中允许它不会说明它意味着什么).要求探讨设计空间的论文.应该可以在不破坏任何代码的情况下改变它,但是没有时间为C++ 17做这件事.


好的,所以`constexpr`支持可以在即将到来的科纳会议中添加吗?
@MSalters谢谢.如果没有采纳,我会感到失望.在编写constexpr函数时,我还记得不要再使用它.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有