问题标签 [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 投票
2 回答
2230 浏览

c++ - gcc 是否将非常量表达式函数的内置函数视为常量表达式

请参阅更新以获得更好的问题示例。原始代码有混合问题,使图片变得混乱

这个问题为什么我可以在 constexpr 函数中调用非 constexpr 函数?提出了以下代码

正如我回答的那样,这是不正确的,gcc 4.8.2允许它(现场观看)。

但是,如果我们使用该-fno-builtin标志会gcc产生错误(现场查看):

所以它seems认为gcc它的内置版本printf是一个常量表达式。gcc 这里记录了内建函数,但没有记录这种情况,即非 constexpr 函数的内建函数可以被视为常量表达式。

如果确实如此:

  • 允许编译器这样做吗?
  • 如果他们被允许,他们是否不必记录它以使其符合要求?
  • 这是否可以被视为扩展,如果是这样,这似乎需要一个警告,因为C++ 草案标准部分1.4 实施合规性8段说(强调我的):

一个符合规范的实现可以有扩展(包括额外的库函数),只要它们不改变任何格式良好的程序的行为。需要实现来诊断使用根据本国际标准格式错误的扩展的程序。然而,这样做之后,他们可以编译和执行这样的程序。

更新

正如凯西指出的那样,原始问题中发生了一些事情,使其成为一个糟糕的例子。一个简单的例子是使用不是 constexpr 函数的std::pow :

编译和构建没有警告或错误(实时查看),但添加-fno-builtin会生成错误(实时查看)。注意:为什么数学函数在 C++11 中不是 constexpr

0 投票
1 回答
10174 浏览

c++ - 为什么在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?

如果我们查看C++ 标准部分草案5.1.2 Lambda 表达式2段说(强调我的未来):

对 lambda 表达式的求值会产生一个临时纯右值 (12.2)。这个临时对象称为闭包对象。lambda 表达式不应出现在未计算的操作数中(第 5 条)。[注意:闭包对象的行为类似于函数对象(20.8)。-结束注释]

和部分5.19 常量表达式2段说:

条件表达式是核心常量表达式,除非它涉及以下之一作为可能计算的子表达式 (3.2),但逻辑与 (5.14)、逻辑或 (5.15) 和条件 (5.16) 操作的子表达式未计算不被视为[...]

并具有以下项目符号:

— 一个 lambda 表达式 (5.1.2);

那么为什么 lambdas 表达式不允许在未计算的操作数中使用,但在常量表达式的未计算部分中却允许呢?

我可以看到对于未评估的操作数,在几种情况下(decltypetypeid)的类型信息不是很有用,因为每个 lambda 都有一个唯一的类型。虽然我们为什么要在常量表达式的未评估上下文中允许它们尚不清楚,但也许是为了允许SFINAE

0 投票
1 回答
1848 浏览

sql-server-2008 - 为列中的每一行返回一个常量文本字符串(动态)SQL Server 2008

提前感谢您的时间和专业知识。

我使用以下查询

得到一个看起来像这样的表格结果

我的结果需要如下所示,其中常量列中的值实际上并不位于任何表中的任何位置。相反,无论返回多少行,它都会动态返回,结果集总是为每一行返回文本“链接”。

0 投票
3 回答
349 浏览

c++ - 在标头中声明符号常量而不进行初始化?

在头文件中定义符号常量是常见的做法:

丑陋的。

更好,因为不是预处理器。

更好的是,因为T_Type带有目的信息,并且编译器可以进行额外的检查(例如,如果所有情况都在 a 中处理switch)。

可能还有六种变种。不过有一件事......他们都向客户披露了数值。我想隐藏这些值,只是因为它们不重要。但是我能想到的一种方法...

...不适用于 egcase语句(作为T_FOOT_BAR是常量,但不是编译时常量表达式)。

没有办法拥有这一切?

  • 在标题中声明符号常量而不透露数值,
  • 但可用作常量表达式,例如在switch语句中?

我的理解水平说“不”,但我知道我并不知道一切。;-)

0 投票
2 回答
486 浏览

java - Java 常量表达式和代码消除

正如这里所讨论的,javac 和其他 Java 编译器可以为if条件是“常量表达式”的语句提供代码消除功能。

如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,这会受到怎样的影响?

例如,假设我在各自指定的包中有以下类:

显然,如果foo-package 在运行时从外部 jar 文件加载,编译器在技术上不能仅仅假设这Foo.CONDITION将是错误的并且不应该消除-statementtrueif-branch。

然而,如果FooBar实际上在同一个包中,则true-branch 肯定应该被消除(如果编译器完全支持代码消除)。

不太确定如何最好地表达这个问题,但是:对于常量表达式 inFoo需要多“接近”才能被认为是常量 in ?他们需要在同一个文件中吗?同一个包?同一个jar文件?还是根本不重要(即编译器是否总是将其视为常量并在编译时使用在构建路径中找到的值)?BarFooBarFoo.CONDITION

0 投票
2 回答
57 浏览

c++ - 以动态方式进行常量初始化

我认为声明为的变量const仅适用Static Initialization。我写了以下内容:

它工作正常。

爱迪生

但我预计代码是无效的,因为它new A()是 anew-expression而不是constant expression. 实际上:秒。5.19/2 N3797:

条件表达式 e 是核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:
[...]
— 新表达式 (5.3.4) ;

[...]

常量表达式要么是一个泛左值核心常量表达式,其值是指具有静态存储持续时间的对象或函数,

0 投票
3 回答
73 浏览

c++ - 将数组的大小设置为从另一个常量的除法派生的常量的值

我有这两个假定的常数:

我正在尝试声明一个数组:

我得到错误:

错误:数组绑定在 ']' 标记之前不是整数常量

手动插入 LONGEST_LR_LINK 的任何一半 MATRIX_SIZE 都不会那么麻烦,但我很好奇这个问题的解决方案是什么。对 const 进行任何类型的计算是不好的做法吗?

0 投票
3 回答
194 浏览

c++ - 获取 std::array 的第二个参数(大小)作为函数参数

在下面的代码中,我需要获取std::array函数参数的大小。我更喜欢std::arraystd::vector因为容器的大小不应该改变。但是,编译器抱怨为error: ‘n’ is not a constant expression. 如何通过函数参数获取数组的大小?

主.cpp:

0 投票
2 回答
556 浏览

c++ - 使用编译时已知的常量 array1 初始化 C++ array2

我有以下数组:

我要初始化一个重复数组,如下:

如果我在 cygwin 上运行 g++ 4.8.2,如下所示:

我收到以下错误:

但是,显然 " int a[4] = { A };" 也不起作用。有没有一种方法可以a通过A使用简单的赋值语句来初始化我的数组,而无需求助于:

?

0 投票
2 回答
1238 浏览

c++ - 将数学计算写成变量初始化中的常量表达式的值会增加计算工作量?

在 C++ 中,常量变量初始化中的数学声明是否需要一些额外的处理?或者现代编译器会在创建 .exe 文件时自动将数学计算的结果放入变量中?

所以例如:

是在方法使用(本例中为构造函数)中使用常量变量 (defaultX) 的代码示例。现在有时最好让开发人员说出价值的来源:

当然他可以把它放在评论中,但让我们假设他想这样做(例如:他很愚蠢)。那么问题是:当初始化该类的对象时,是否计算了整个数学表达式(需要额外的处理),或者当现代编译器创建 .exe 时,它​​已经包含在第一个 MyClass 代码中看到的优化代码?