问题标签 [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.

0 投票
1 回答
746 浏览

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冲突?

0 投票
1 回答
330 浏览

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常量表达式吗?


这是对左值整数常量表达式是否是常量表达式的澄清?

0 投票
1 回答
865 浏览

c++ - 指针中的 constexpr 是否有所作为

constexpr int *np = nullptr和 和有什么不一样int const *np = nullptr

np在这两种情况下,它都是指向为 null 的 int 的常量指针。constexpr在指针的上下文中是否有任何特定用途。

0 投票
3 回答
810 浏览

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,它必须采用指针。所以......几个问题:

  1. 在 constexpr 上下文中获取std::array 指针大小的最佳/最标准方法是什么?

  2. 指针与引用的行为差异是预期的吗?哪个编译器对警告是正确的,gcc或者clang

0 投票
0 回答
97 浏览

c# - 将 View 插入到 RelativeLayout 的 childerne Xamarin Forms

我需要将视图 obj 插入到 relativeLayout 的子数组中。但问题是我不知道我该怎么做,所以它是相对于父母的。就像我添加它时所做的那样,如下所示

有谁知道如何做到这一点?

一如既往,感谢您的宝贵时间。

0 投票
1 回答
105 浏览

c++ - 常量表达式参数

我有一个创建 a 的函数std::bitset,它的长度是一个常量函数参数。它不起作用,因为常量不是“整数常量表达式”。有什么办法可以使这项工作?

以供参考:

0 投票
1 回答
1426 浏览

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.

肯定有某种方法可以在可重复的宏中隐藏常量检查,传递值(因此它可以用作表达式),并且不需要语句行或引入额外的标识符?

0 投票
5 回答
5123 浏览

c++ - 在常量表达式中除以零

如果我在常量表达式中除以零,我的玩具编译器会崩溃:

C 和/或 C++ 标准是否允许这种行为?

0 投票
3 回答
1745 浏览

c - 如何强制 GCC 编译器在编译时使用 -Os 计算常量

我尝试使用宏在编译时计算常量 C 字符串的哈希值。这是我的示例代码:

现在我运行GCC来显示列表:

结果正如预期的那样:所有字符串都被消除并被其哈希值替换。但通常我使用-Os来编译嵌入式应用程序的代码。当我尝试这样做时,我只对少于四个字符的字符串进行哈希处理。我还尝试设置参数max-unroll-times并使用GCC 4.9

我无法理解这种行为的原因以及如何扩展这个四个字符的限制。

0 投票
1 回答
224 浏览

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核心常量表达式 ,它的值是一个对象,对于那个对象及其子对象:
...

这似乎违背了数理逻辑的基本原理。