请考虑以下代码片段来测试即将推出的 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(使用前将#替换为@)