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

时间:2017-01-12 21:01:02

标签: c++ constexpr c++17 structured-bindings

考虑以下代码片段来测试即将发布的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关键字,无论是正面还是负面。

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

1 个答案:

答案 0 :(得分:35)

  

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

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

  

decl-specifier-seq 只应包含类型说明符 auto(7.1.7.4)和 cv-qualifiers

这意味着无法使用constexpr声明它。

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

  

评论:分解没有明显的原因   声明不能声明为静态,   thread_local或constexpr。
  建议的更改:允许constexpr,static和thread_local到   允许的一组 decl-specifiers

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

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