但代码编译在clang和g

但代码编译在clang和g

本文介绍了至于我可以告诉下面的功能不是constexpr,但代码编译在clang和g ++。我缺少什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 限时删除!! 我在N4140的§5.19/ 2中有这个例子: constexpr int incr(int& n){ return ++ n; } 据我所知,这不是一个 constexpr 函数。但是代码片段在clang和g ++中编译。请参见实例。 $ c $ b 解决方案在C ++ 14中,constexpr函数的规则被放宽了, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3597.html =nofollow> N3597:放松对constexpr函数的约束。该论文纳入了理由和效果,它包括以下(强调我): p> 发现这包括在N4140节 7.1.5 [dcl.constexpr] 中,其中说: constexpr函数的定义应满足以下约束: virtual(10.3); 其返回类型应为文字类型; 每个参数类型都应为文字类型; 其函数体应为= delete,= default或不包含 一个asm定义, a goto语句, a try-block或 非文字类型或静态或线程存储持续时间或对其执行无初始化。 最后一个例子显示了如何在constexpr中使用 incr : constexpr int h(int k){ int x = incr(k) // OK:incr(k)不需要是核心 //常量表达式 return x; } constexpr int y = h(1); // OK:用值2初始化y // h(1)是一个核心常量表达式,因为 // k的生命周期在h(1)内开始 并且规则覆盖 k的生命周期在h(1) : 7.1.5 [dcl.constexpr] 中的措词显示了为什么 incr 是一个有效的constexpr:由TC提供的修改示例: constexpr int& as_lvalue(int&& i){return i; } constexpr int x = incr(as_lvalue(1)); 显示,我们确实可以使用 incr 一个核心常数表达式的子表达式,因此它不会形成错误。 I got this example from §5.19/2 in N4140:constexpr int incr(int &n) { return ++n;}As far as I can tell, this is not a constexpr function. But the snippet compiles in clang and g++. See live example. What am I missing here? 解决方案 In C++14 the rules for constexpr function were relaxed and the paper N3597: Relaxing constraints on constexpr functions. The paper goes into the rationale and the effects and it includes the following (emphasis mine):and:and we can find this covered in N4140 section 7.1.5 [dcl.constexpr] which says:The last example shows how incr can be used in a constexpr:constexpr int h(int k) { int x = incr(k); // OK: incr(k) is not required to be a core // constant expression return x;}constexpr int y = h(1); // OK: initializes y with the value 2 // h(1) is a core constant expression because // the lifetime of k begins inside h(1)and the rule that covers the lifetime of k begins inside h(1) is:The wording in 7.1.5 [dcl.constexpr] shows us why incr is a valid constexpr:As the modified example given by T.C.:constexpr int& as_lvalue(int&& i){ return i; }constexpr int x = incr(as_lvalue(1)) ;shows, we can indeed use incr as a subexpression of a core constant expression and therefore it is not ill-formed. 这篇关于至于我可以告诉下面的功能不是constexpr,但代码编译在clang和g ++。我缺少什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 1403页,肝出来的..
09-06 08:40