Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';分解声明是否为constexpr?_C++_Constexpr_C++17_Structured Bindings - Fatal编程技术网

C++ 为什么可以';分解声明是否为constexpr?

C++ 为什么可以';分解声明是否为constexpr?,c++,constexpr,c++17,structured-bindings,C++,Constexpr,C++17,Structured Bindings,考虑以下代码段来测试即将发布的C++17功能分解声明(以前称为结构化绑定) #包括 #包括 constexpr自动divmod(int n,int d) { 返回std::make_pair(n/d,n%d);//在g++7中,也只是std::pair{n/d,n%d} } int main() { constexpr auto[q,r]=divmod(10,3); 静态断言(q==3&&r==1); } 这在g++7-SVN和clang-4.0-SVN上都失败,消息如下: 分解声明不能声明为

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

#包括
#包括
constexpr自动divmod(int n,int d)
{
返回std::make_pair(n/d,n%d);//在g++7中,也只是std::pair{n/d,n%d}
}
int main()
{
constexpr auto[q,r]=divmod(10,3);
静态断言(q==3&&r==1);
}
这在g++7-SVN和clang-4.0-SVN上都失败,消息如下:

分解声明不能声明为“constexpr”

删除
constepr
定义并更改为常规的
assert()
在两种编译器上都有效

关于此功能的WG21论文中没有一篇提到
constexpr
关键字,无论是正面还是负面

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

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

没有其他原因。标准在[dcl.dcl]第8页中规定:

decl说明符seq应仅包含类型说明符
auto
(7.1.7.4)和cv限定符

这意味着它不能用
constexpr
声明

这是国家机构对C++17 CD发表评论的主题,参见美国95:

评论:没有明显的理由解释分解 声明不能声明为静态, 本地线程或constexpr.
建议的更改:允许本地的constexpr、static和thread\u 允许的decl说明符集

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


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

OK,所以可以在即将召开的Kona会议中添加
constexpr
支持?@TemplateRex:国家机构的意见是对ISO的正式回应,需要在正式发布之前得到答复。但提议的变更很可能被拒绝,例如,如果对该变更的非预期副作用存在重大疑问。也就是说,如果有一个不明显的原因,那么这个原因可能值得一提。@MSalters谢谢。如果不采纳,我会感到失望。在编写constexpr函数时,我还需要记住一件事,那就是不要使用它。我注意到当前的标准草案仍然有您引用的部分。您知道拒绝注释US 95的原因吗?@TemplateRex关于包含结构化绑定的constexpr函数的新问题:“以前称为结构化绑定”???它们现在仍然被称为“结构化绑定”(structuredbindings)()我是否遗漏了一些历史性的东西?
#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);
}