gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:32:28 27 4
gpt4 key购买 nike

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

#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 上都失败了,消息是:

decomposition declaration cannot be declared 'constexpr'

删除 constexpr 定义并更改为常规 assert() 对两种编译器都有效。

关于此功能的 WG21 论文均未提及 constexpr 关键字,无论是正面还是负面。

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

最佳答案

Question: why aren't decomposition declarations be allowed to be constexpr? (apart from "because the Standard says so").

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

The decl-specifier-seq shall contain only the type-specifier auto (7.1.7.4) and cv-qualifiers.

这意味着它不能用 constexpr 声明。

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

Comment: There is no obvious reason why decomposition declarations cannot be declared as static, thread_local, or constexpr.
Proposed change: Allow constexpr, static, and thread_local to the permitted set of decl-specifiers.

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

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

关于c++ - 为什么分解声明不能是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com