问题标签 [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 回答
3922 浏览

c++ - 枚举类型值作为 C++ 中数组的长度

众所周知,C++中的数组长度是必须确定的。然后我们可以使用:

或者:

在编译之前确定数组的长度。但是,当我阅读 lippman 的《c++ Primer》一书时,在第 5 版的第 3.5.1 章中,它说:数组的长度必须是一个常量表达式。那么问题来了:

代码在mingw32-g++中编译成功。但是在VS2008中失败了,错误是:

而且我认为枚举值是恒定的,所以它应该用作数组的长度。正确的?

我很困惑,你能帮帮我吗?谢谢你。

0 投票
2 回答
658 浏览

java - Switch 中的静态最终整数:为什么不能这样做?

我在图书馆项目中有一个 Switch 引用来自 R.java 的资源 ID:

从 ADT 14 开始,R 字段不再是最终的,因此 Google 建议将 switch 更改为嵌套 if。很公平。

但是,我想知道为什么这不起作用:

或这个:

他们都抱怨错误“Case statements must be constant expressions”......不是吗,特别是第一个?无论 R.id.xxx 可能是哪个值,我不是将其“最终化”为快照常量吗?

0 投票
2 回答
283 浏览

c++ - 数组可以在编译时被索引吗?

对另一个问题的评论中,用户 hvd 陈述了以下内容:

...虽然可以将字符串文字传递给constexpr函数,并且在常量表达式中允许对字符串文字进行数组索引,但对constexpr函数参数的索引操作不符合常量表达式的条件。

我没有完全理解是什么意思。是不是意味着hash_value下面代码中的变量

无法在编译时评估?您能否详细说明引用的评论并判断我是否正确?

0 投票
1 回答
1785 浏览

c++ - C++11 之前的“常量表达式”

constexpr关键字是在 C++11 中引入的,因为(我认为)是“常量表达式”的相应概念。然而,这个概念隐含在 C++98/c++03 中,因为数组声明需要一个常量表达式:

还有其他“常量表达式”,即可以(和/或必须)在编译时评估的表达式;一个例子是模板参数。

对于 C++11 之前的版本,C++98/03 标准或其他地方是否存在以下内容?

  • 需要常量表达式的语法结构的完整列表(例如数组声明和模板实例化)
  • 管理此类常量表达式的规则(大概这只是从上面列表中的项目到标准中的定义的映射)
0 投票
2 回答
328 浏览

c - 在 #if 和 #elif 的表达式中,名称的“已定义”前缀是什么,以及标识符(包括 C 关键字)被 0 替换是什么?

我试图绕过它但放弃了。您能否解释以下内容,摘自 Mike Banahan 的 C 书(第 7.3.7 节条件编译)。尽管付出了很多努力,但我无法掌握“组成的令牌序列......”之后的部分。你能简单地说一下吗

1)“定义的”前缀究竟是什么,以及

2) 名称甚至 C 关键字减少到零(不要忘记对 sizeof 的混淆引用)怎么办?

用一小段代码进行解释将非常有帮助。谢谢你。

#if 和 #elif 构造将单个整数常量表达式作为其参数。预处理器整型常量表达式与其他整型常量表达式相同,只是它们不能包含强制转换运算符。构成常量表达式的记号序列会进行宏替换,但以定义为前缀的名称不会被扩展。在此上下文中,如果当前定义了NAME,则表达式定义的 NAME定义的 ( NAME )计算结果为 1 ,否则计算结果为0。表达式中的任何其他标识符,包括那些是 C 关键字的标识符替换为值 0。然后计算表达式。甚至替换关键字意味着不能在这些表达式中使用 sizeof 来获得您通常期望的结果。

0 投票
2 回答
2331 浏览

c - const 变量不能在常量表达式中使用?

为什么这个 C 代码在 Visual Studio 2013 Ultimate 中是非法的?

它给error C2057: expected constant expression.


原始问题

我完全被这个迷惑了。

相关功能:

错误信息:error C2057: expected constant expression

在线的char resultBufNative[size+1];

对我来说,这使得相关代码如下:

显然,const size_t + 1不是一个常量表达式。

没有定义或宏size在讨论(用 xyzabc 替换它会产生相同的错误)。size_t定义为typedef unsigned int __w64 size_t当我size_t在 IDE(Visual Studio Ultimate 2013)中鼠标悬停时。

在 C2057 预期的常量表达式错误之后,编译器又给出了 2 个错误:

对于同一行代码。自然,这些是因为它不知道是什么size + 1,所以它变成了0。

使用

error C2065: 'constexpr' : undeclared identifier.

使用

error C2057: expected constant expression.

使用

error C2057: expected constant expression.

使用

error C2057: expected constant expression.

我想我想做的事情不受支持。

0 投票
2 回答
47 浏览

c++ - 使用变量创建数组

我有以下代码:

我明白了

错误 C2057:预期的常量表达式

好的,如何在没有向量或动态分配数组的情况下创建代码中所示的矩阵?

0 投票
1 回答
821 浏览

c++ - 为什么在 C++11 中取消了对逗号运算符在常量表达式中的限制?

最近在回答一个问题时,我意识到C++11中的常量表达式中允许使用逗号运算符,只要表达式被 包围,例如:()

Pre C++11禁止在常量表达式中使用逗号运算符,来自 C++11 前标准部分的草案5.19 常量表达式,其中说(强调我的):

[...]特别是,除了 sizeof 表达式,不得使用函数、类对象、指针或引用,不得使用赋值、递增、递减、函数调用或逗号运算符。

为什么在 C++11 之前的常量表达式中不允许使用逗号运算符,为什么取消了这个限制?

0 投票
1 回答
144 浏览

c++ - N4140 的要点 §5.19/2.3 中的“未定义”一词是什么意思?

来自N4140 §5.19/2.3(强调我的)

— 调用未定义的constexpr 函数或 未定义的constexpr 构造函数;

从 §7.1.5/2 开始,constexpr 函数和构造函数被隐式内联,也就是说,如果 constexpr 函数未在 TU 中定义,则代码将无法编译。

0 投票
2 回答
1398 浏览

f# - f# 中的参数化测试 - 这不是有效的常量表达式

由于某种原因,当通过TestCaseattrubute 将参数传递给测试时,我收到以下关于第一个参数的错误消息,在本例中是一个数组:

这不是有效的常量表达式或自定义属性值

但是,当从属性和方法本身中删除最后一个参数时,一切正常。

我究竟做错了什么?最好我也会定义一个元组,int * int但它似乎也不起作用。