问题标签 [constant-expression]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 泛左值整数常量表达式是常量表达式吗?
N4527 5.20 [expr.const]p3
整型常量表达式是整型或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。
5.20 [expr.const]p5
一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:
(5.1) — 每个引用类型的非静态数据成员指的是一个实体,它是一个常量表达式的允许结果,并且
(5.2) — 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象末尾的地址 (5.7)、函数的地址或空指针值.
如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。
问题1:是a
整数常量表达式吗?
问题2:是a
常量表达式吗?
问题3:glvalue整型常量表达式是常量表达式吗?
问题4:
如果问题3的答案是肯定的,如果对象具有自动存储时长,这是否与5.20 p3冲突?
c++ - `const int a = 1;` 是 `a` 一个常量表达式,如果 `a` 有自动存储持续时间
N4527 5.20[expr.const]p2
条件表达式 e 是核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:
(2.7) — 左值到右值的转换 (4.1),除非它应用于
(2.7.1) —一个整数或枚举类型的非易失性左值,它引用一个完整的非易失性常量对象,该对象具有前面的初始化,用常量表达式初始化,或
(2.7.2) — 引用字符串字面量 (2.13.5) 的子对象的非易失性泛左值,或
(2.7.3) — 一个非易失性泛左值,它指代用 constexpr 定义的非易失性对象,或指代此类对象的非可变子对象,或
(2.7.4) — 文字类型的非易失性左值,指的是一个非易失性对象,其生命周期开始于对 e 的评估;
5.20[expr.const]p5
一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:
— 每个引用类型的非静态数据成员都引用一个实体,该实体是一个常量表达式的允许结果,并且
— 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 (5.7)、函数的地址或空指针值。
如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。
In int b[a]{};
,a
是一个 id 表达式,a
是一个左值核心常量表达式。是a
常量表达式吗?
c++ - 指针中的 constexpr 是否有所作为
constexpr int *np = nullptr
和 和有什么不一样int const *np = nullptr
?
np
在这两种情况下,它都是指向为 null 的 int 的常量指针。constexpr
在指针的上下文中是否有任何特定用途。
c++ - constexpr 上下文中 std::array 指针的 size()
假设我有一个类似的功能:
显然缓冲区的大小可以在编译时评估:数据的constexpr
大小为 8 个元素,8 * 2 = 16 字节。
但是,当使用 编译时,-Wall
我得到了臭名昭著的错误:-pedantic
-std=c++11
警告:可变长度数组是 C99 功能 [-Wvla-extension]
我认为这是有道理的:array::size()
is constexpr
,但它仍然是一个方法,并且在上面的函数中我们仍然必须取消引用一个指针,它不是constexpr
。
如果我尝试类似:
gcc
(试用版 5.2.0)似乎很高兴:没有警告。
但是对于clang++
(3.5.1),我仍然收到抱怨可变长度数组的警告。
就我而言,我不能轻易更改 的签名test
,它必须采用指针。所以......几个问题:
在 constexpr 上下文中获取
std::array
指针大小的最佳/最标准方法是什么?指针与引用的行为差异是预期的吗?哪个编译器对警告是正确的,
gcc
或者clang
?
c# - 将 View 插入到 RelativeLayout 的 childerne Xamarin Forms
我需要将视图 obj 插入到 relativeLayout 的子数组中。但问题是我不知道我该怎么做,所以它是相对于父母的。就像我添加它时所做的那样,如下所示
有谁知道如何做到这一点?
一如既往,感谢您的宝贵时间。
c++ - 常量表达式参数
我有一个创建 a 的函数std::bitset
,它的长度是一个常量函数参数。它不起作用,因为常量不是“整数常量表达式”。有什么办法可以使这项工作?
以供参考:
c - 如何检查表达式在 C 中是否为常量?
假设我有一个场景,我需要确保我的代码中使用的值是编译时常量(例如,可能是对P10 规则 2 “固定循环边界”的严格解释)。如何在 C 语言级别强制执行此操作?
C在语言级别支持整数常量表达式的概念。必须有可能找到一种方法来利用这一点,以便只有符合本规范的值才能在表达式中使用,对吧?例如:
一些部分解决方案不够通用,无法在多种情况下使用:
位域:
static_assert
在 C11 之前的 C中实现的经典策略是使用一个位域,当条件失败时其值将是非法的:虽然这可以很容易地包装以用作表达式的一部分,但它根本不通用 -
expression
"[may] 的最大值不超过将指定类型的对象的宽度,如果省略了冒号和表达式"(C11 6.7.2.1),它对expression
(通常可能是 64)的大小设置了非常低的便携限制。它也可能不是负面的。枚举:要求
enum
任何初始化表达式都是整数常量表达式。但是,enum
声明不能嵌入到表达式中(与struct
定义不同),需要它自己的语句。由于枚举器列表中的标识符被添加到周围的作用域中,因此我们每次也需要一个新名称。__COUNTER__
没有标准化,所以没有办法从宏中实现这一点。案例:同样,一行的参数表达式
case
必须是一个整数常量。但这需要周围的switch
陈述。这并不比 好很多enum
,而且它是您不想隐藏在宏中的那种东西(因为它会生成真实的语句,即使它们很容易被优化器删除)。数组声明:从 C99 开始,数组大小甚至不必是常量,这意味着它无论如何都不会产生所需的错误。这也是一个需要将名称引入周围范围的语句,遇到与
enum
.
肯定有某种方法可以在可重复的宏中隐藏常量检查,传递值(因此它可以用作表达式),并且不需要语句行或引入额外的标识符?
c++ - 在常量表达式中除以零
如果我在常量表达式中除以零,我的玩具编译器会崩溃:
C 和/或 C++ 标准是否允许这种行为?
c - 如何强制 GCC 编译器在编译时使用 -Os 计算常量
我尝试使用宏在编译时计算常量 C 字符串的哈希值。这是我的示例代码:
现在我运行GCC来显示列表:
结果正如预期的那样:所有字符串都被消除并被其哈希值替换。但通常我使用-Os来编译嵌入式应用程序的代码。当我尝试这样做时,我只对少于四个字符的字符串进行哈希处理。我还尝试设置参数max-unroll-times
并使用GCC 4.9:
我无法理解这种行为的原因以及如何扩展这个四个字符的限制。
c++ - `核心常量表达式`与`常量表达式`
核心常量表达式的定义取决于常量表达式的概念,如N4140 的要点 (2.7.1) 和 (2.9.1) 中所示。
§5.19/2:
条件表达式
e
是核心常量表达式,除非按照e
抽象机 (1.9) 的规则对 的求值将求值以下表达式之一:
...
(2.7.1) — 整数或枚举类型的非易失性左值,它引用具有先前初始化的非易失性常量对象,用常量表达式初始化
...
(2.9.1) — 用常量表达式初始化或
常量表达式的定义取决于核心常量表达式的概念,如 N4140 的 §5.19/4 所示:
一个常量表达式要么是一个glvalue核心常量表达式,它的值是指一个具有静态存储持续时间的对象或一个函数,或者是一个prvalue核心常量表达式 ,它的值是一个对象,对于那个对象及其子对象:
...
这似乎违背了数理逻辑的基本原理。