39

考虑以下代码片段来测试即将到来的 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?(除了“因为标准这么说”)。

4

1 回答 1

40

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

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

decl-specifier-seq应仅包含类型说明符 ( auto7.1.7.4) 和cv-qualifiers

这意味着它不能用constexpr.

这是 C++17 CD 上 National Body 评论的主题,请参阅P0488R0中的 US-95 :

注释:没有明显的原因不能将分解声明声明为 static、thread_local 或 constexpr。
提议的更改:允许 constexpr、static 和 thread_local 到允许的decl-specifiers集。

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

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

于 2017-01-12T21:07:48.937 回答