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

delphi - 预期的 Delphi 常量表达式

我收到以下代码的“预期常量表达式”错误:

TBoard定义为:

我在标记的行上收到错误:

有人知道发生了什么吗?
提前致谢!

0 投票
1 回答
2205 浏览

c# - C# 编译器或 JIT 可以优化掉 lambda 表达式中的方法调用吗?

在对另一个 StackOverflow 问题进行讨论(在评论中)之后,我开始讨论这个问题,我很想知道答案。考虑以下表达式:

在这种情况下,将评估移出 Where 子句是否会有任何(性能)​​优势ListOfDates.Max(),或者 1. 编译器或 2. JIT 会优化它吗?

我相信 C# 只会在编译时进行常量折叠,并且可以说 ListOfDates.Max() 在编译时无法知道,除非 ListOfDates 本身以某种方式保持不变。

也许还有另一个编译器(或 JIT)优化可以确保只评估一次?

0 投票
2 回答
311 浏览

c - C中的最小保证常数折叠

问题

我很好奇是否有任何关于在 C 中进行恒定折叠的保证。

我看过的地方

一个我不知道声誉的网站上的这个链接提出了一个临时评论:

所有 C 编译器都可以折叠宏扩展后出现的整数常量表达式(ANSI C 要求)。

但是我没有在例如 The C Programming Language, second edition 中看到任何内容(我认为它已经彻底更新以说明 ANSI C 的所有细节)。但是在检查索引以获取相关词的引用后,我没有发现任何可以保证这一点的东西。第 38 页和第 209 页特别接近,因为他们说任何可以在编译时计算的表达式都可以在可以使用常量的地方使用(如果我们足够迂腐的话,可能会有一些限制),并且它说这样的表达式“可能”在编译时被评估,而不是“将”/(一些同义词)。

我搜索了这个 C89 最终草案。单词“folding”和“folded”没有产生值的结果,搜索“constant expression”产生了63个匹配,其中我检查了大约一半。感兴趣的主要部分似乎与本书基本相同(它使用单词“ can ”而不是“may”,但在这种情况下它们是同义词)。

这两个似乎在逻辑上强烈暗示每个 ANSI C 编译器都必须具有基本的常量折叠功能,但与此同时,似乎没有任何硬性禁止将常量表达式编译成计算表达式的代码在运行时(这样的实现仍然受益于常量表达式,因为编译器可以生成计算一次的代码,然后假设值不会改变,并且这样的实现可能会受到给定底层架构的限制 - 例如几个 RISC 架构必须使用两条指令来初始化某些可能的值,或者从内存位置加载它们)。

我还简要搜索了这个 C99 最终草案,但“折叠”产生了一个没有价值的结果,而“折叠”和“常量”各有一百多个匹配项,我目前无法分配时间来爬取。

动机

我编写了这些宏是为了在一些有点旋转的代码中更清晰地表达语义/意图:

..wheren始终是整数文字。我想得到安慰,听到一个令人放心的声音说“没关系,使用的每个远程重要的 C 编译器都会为你折叠这些常量”。(PS 我问了一个单独的问题,即是否UCHAR_NTH_BIT_m应该像位从第 0 位或第 1 位开始一样,希望在正确的位置。)

是的,底部的宏可以变成单独的宏,例如#define UCHAR_1ST_BIT_m (unsigned char )1通过#define UCHAR_3RD_BIT_m (unsigned char )4代码或我在代码中碰巧需要的宏 - 虽然我不确定哪个更好,但这可能是一个有争议的问题,因为如果我想要要成为一名优秀的迂腐语言律师类型的 C 程序员,我不能完全避免顶级程序员(必须确保代码在那些 DSP/嵌入式和古老的大型机 C 实现上做正确的事情)。

0 投票
2 回答
878 浏览

c++ - constexpr 中的字节顺序

我想创建一个返回系统字节序的 constexpr 函数,如下所示:

现在,由于函数将在编译时而不是在实际的目标机器上执行,C++ 规范提供什么保证来确保返回正确的结果?

0 投票
2 回答
325 浏览

c - 为什么这个添加被默默地忽略?

我有以下 C 代码:

如果我使用 Microsoft Visual Studio Community 2015 编译它(作为 C 或 C++)然后运行它,输出类似于以下内容:

似乎+ 0x8000000000000000我希望设置高位的 codea[1]已被默默地忽略。

a但是,如果我移动inside的初始化main,输出就是我所期望的:

对于a全局,为什么添加被默默忽略?尝试添加是否应该实际设置高位,a[1]还是应该导致编译器错误?

有趣的是,如果+ 0x8000000000000000在上面的代码中替换为| 0x8000000000000000,我会得到“错误 C2099:初始化程序不是常量”。

编辑:即使没有演员表,也会出现类似的问题。为 x64 编译,以下代码打印相同的值(例如000000013FB8D180)三次:

0 投票
2 回答
79 浏览

c++ - 模板、数组和常量表达式

考虑下面的代码:

它不能编译为ref[0]不是一个常量表达式。

无论如何,下面的代码编译得很好:

他们是否应该出于或多或少相同的原因编译或失败?

[expr.const]我们得到:

条件表达式e核心常量表达式,除非e[...] 的评估将评估以下表达式之一:
[...]
- 一个 id 表达式,它引用引用类型的变量或数据成员,除非引用有一个前面的初始化并且要么
    - 它用一个常量表达式初始化,要么 - 它
    的生命周期开始于e;

无论如何,在这种情况下,它是用常量表达式初始化的,并且生命周期与 相同e,因此该规则不适用。

我的推理有什么问题?

作为一个附带问题,我会问是否可以使用这样的数组或其中的一部分作为模板参数。

0 投票
2 回答
275 浏览

c++ - `static_assert`、`if constexpr(...)` 和 `constexpr` 变量之间的模板中`constexpr` lambdas 的评估不一致

(使用g++ 7.0中继线。)

鉴于以下“类型到值的包装”实用程序...

...我创建了以下检查表达式有效性的函数:


is_valid函数可以按如下方式使用:

也可以在室内使用static_assert...

...和里面if constexpr


但是,当is_valid在模板函数中使用时(将模板参数作为type_c值传递),会发生一些奇怪的事情:

  • static_assert(is_valid(/*...*/))工作正常。

  • constexpr auto x = is_valid(/*...*/)工作正常。

  • if constexpr(is_valid(/*...*/) 编译失败

错误:

为什么这无法仅针对if constexpr(is_valid(/*...*/))案例进行编译?这与static_assert和不一致constexpr auto x = /*...*/

这是g++' 实施中的缺陷if constexpr吗?

wandbox 上的完整示例

0 投票
1 回答
742 浏览

ruby-on-rails - ProjectsController#index 中的名称错误

在我的 Rails 应用程序中,我收到以下错误:

我的路线如下所示:

和问题控制器:

到目前为止,我的调查表明它Project尚未初始化,但这无关紧要,因为它是一个构造函数,在它自己的类中。我什至尝试通过将此行添加config.autoload_paths += %W( #{config.root}/app/controllers)application.rb. 似乎还没有任何效果。任何想法将不胜感激。谢谢!

0 投票
3 回答
5730 浏览

c++ - 为什么创建静态 const std::string 会导致异常?

我有字符串常量,用于在我的应用程序的多个位置使用的字符串:

当发布有关其他内容的问题时(编译期间未包含在目标中的 .h 文件会发生什么情况?),另一位用户发表了以下评论:

请注意,在这种情况下,您的静态字符串是全局的。所以他们可以随时创建异常并且不能被捕获。我建议您使用返回字符串引用的函数。std::string const &mystring { 静态 std::string const mystring = "IamAwesum"; return mystring} 通过这种方式,您的对象仅在需要时才构造

有人可以解释为什么以我上面这样做的方式使用静态 const 字符串会引发异常吗?

0 投票
2 回答
498 浏览

c++ - 两个指针之间的区别是合法的c ++ 17常量表达式吗?

根据cppreference部分核心常量表达式19)两个指针之间的减法运算符在c++14 之前不是合法的常量表达式。我可以假设以下代码是合法的 c++17 代码还是这种解释是滥用?