The assert
- 宏来自<cassert>
提供了确保满足条件的简洁方法。如果参数的计算结果为true
,不会产生任何进一步的影响。但是,在这种情况下,它的调用也可以在常量表达式内部使用吗?
这件事已被处理LWG 2234 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2234,在放宽限制后又重新受到关注constexpr
功能已被引入。
拟议决议:
该措辞是相对于N3936而言的。
-
在 17.3 中的现有列表中引入以下新定义
[定义]:
常量子表达式[defns.const.subexpr]
其计算结果为 a 的子表达式的表达式条件表达式CE(5.16 [expr.cond]) 不会阻止CE不再是核心常量表达式 (5.20 [expr.const])。
-
在 19.3 [断言] p1 之后插入一个新段落,如下所示:
-?- 一种表达assert(
E)
是常量子表达式 ( [defns.const.subexpr]),如果
常量子表达式
该决议提出了一个概念常量子表达式- 本质上是一个表达式,它本身(不一定)不是常量表达式,但可以在常量表达式内部使用。例如考虑
constexpr void f() {
int i = 0;
++i;
}
++i
不是常量表达式,因为它修改生命周期在该表达式之外开始的对象(第 5.20/(2.15) 节)。然而,表达f()
完全是一个常量表达式,因为前一点不适用 -i
的生命周期开始于f
. Hence ++i
是一个常量子表达式,如++i
并不能阻止f()
从一个常数表达式。
And assert
?
该决议的第二部分保证assert(
E)
是一个常量子表达式,如果NDEBUG
被定义或者参数本身是一个常量子表达式并且计算结果为true
。这意味着调用assert
也可以是 bog 标准常量表达式。
以下是格式良好的:
constexpr int check(bool b) {
assert(b);
return 7;
}
constexpr int k = check(true);
b
是一个常量子表达式,计算结果为true
在通话中check(true)
, hence assert(b)
是一个常量子表达式,因此不会阻止check(true)
从成为一体。
当然,同样的陷阱static_assert
在模板中是可能的。鉴于NDEBUG
未定义,此定义格式不正确,§7.1.5/5 不需要诊断:
constexpr void fail() {
assert(false);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)