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

c++ - 常量表达式中的条件运算符

我用 MSVC 10 尝试了以下代码片段,它工作正常。

我想知道的是:当所有操作数都是常量表达式时,C++ 标准(最好是 C++98)是否允许我在常量表达式中使用条件运算符,或者这是微软的怪癖/扩展?

0 投票
2 回答
427 浏览

.net - 表达式树如何捕获局部变量

我目前正在努力创建动态表达式,并且我有以下场景,我希望帮助实现。

给定:

所以我的问题是我不能让 MakeDynamicPredicate 返回的谓词等于 MakePredicate 函数生成的谓词。

我阅读了Jon Skeet 的回复帖子,但不明白如何实现 ConstantExpression 以便捕获局部变量...

任何帮助将不胜感激。

附加信息:以后我可能不知道正在使用的类,因此它最终将被抽象为更通用。

0 投票
2 回答
1513 浏览

c++ - C ++ 11中的常量表达式中是否允许逗号运算符?

在回答关于 C++11的 SO 的这个问题的过程中,我意识到在 C++03(以及 C 中)中,在constant-expression中明确禁止使用逗号运算符。

C++03 Standard 关于常量表达式的第 5.19/1 段说:

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

然而,在 C++11 中,最后提到逗号运算符的部分似乎消失了。虽然 C++11 标准的第 5.19/2 段明确规定赋值、递增、递减和非constexpr函数调用表达式不应作为常量表达式的子表达式出现,但逗号运算符的使用似乎并不被禁止了。

例如,以下程序在 GCC 4.7.2 和 Clang 3.3 上编译得很好std=c++11(除了编译器警告说逗号运算符无效并且xarr变量未使用):

但是,必须说,即使是以下程序也可以使用该-std=c++03选项(在 Clang 和 GCC 上)编译良好,这显然是正确的,鉴于上述 C++03 标准的引用:

问题:

C++03 和 C++11 在常量表达式中是否允许使用逗号运算符有区别,还是我遗漏了什么?

作为一个奖励(非建设性)问题,我很想知道为什么逗号运算符不能用于 C++03 中的常量表达式。

0 投票
1 回答
2165 浏览

c - 如何避免在 if 上获得“常量表达式”?

我有一个assert可以解析为 的宏,if如下所示:

忽略如何handle_failed_assert()工作,你不需要引用这个do { ... } while(0)技巧。请关注这背后的功能。

现在,真正的问题来了。有时我想强迫和断言,让它有意义。所以我们使用这个:

问题是我们有这个基于RVCT 2.2的编译器vrxcc ,它在编译时会抛出这个警告:

当然,这会解析为 compile constant if

我怎么能欺骗编译器接受它?

0 投票
1 回答
108 浏览

c++ - 布尔常量表达式中的冗余实例化

我有一个 n-any 布尔OR运行时函数any_run

以及编译时类似物any_comp

两者都包含断言(分别为运行时或编译时)以确保第一个参数为真。

现在给出以下输入

运行时断言永远不会失败,但编译时断言会失败。这意味着它any_run(false, false)永远不会被调用,但是any_comp <_false, _false>会被实例化,尽管布尔常量表达式

可以在没有实例化的情况下评估为trueif 。A() == trueany_comp <B...>

我的问题是这个实验及其结论是否有效,以及标准对此有何看法。

这很重要,因为如果结论是有效的,我必须更仔细地重新实现几个编译时函数(具有更多的专业化)以使编译更快,尽管我通常更喜欢让事情尽可能简单。

0 投票
1 回答
400 浏览

c++ - 常量变量与常量引用

在一些 C++ 源代码中,我看到可以将表达式结果保存为常量。像这样:

这是什么意思?有这方面的任何文件吗?我找不到它。。


对我来说,它似乎相当于:

因为程序的结果保持不变。真的等价吗?

如果是,为什么该语言完全允许第一种方式来编写它?看起来很混乱。

如果没有,有什么区别?

0 投票
1 回答
16334 浏览

c++ - 不能出现在常量表达式中

在以下 c++ 程序中:

我收到以下错误:“'n' 不能出现在常量表达式中”。由于我对 cpp 比较陌生,所以我真的不知道为什么会发生这个错误(特别是因为我对一个名为 vector 的类做了几乎完全相同的事情,而且根本没有问题)以及如何修复它。我真的很感激任何帮助。

0 投票
1 回答
872 浏览

c++ - 什么是 C++11 标准中的核心常量表达式?

在 C++11 标准 (N3690) 的最新草案中有 11 处对该表达式core constant expression的引用,它们都没有定义该实体是什么。

人们还可以发现,这里core constant expression的表达式定义得很好,基本上与标准用来定义表达式的术语相同。conditional-expression

因此,我想就这个问题获得一些意见,在我看来,这在标准中是错误的。

现在,假设cppreference中的定义是正确的,我还想知道为什么下面的代码片段在ColiruIdeone中编译,尽管提到的定义中有第 (10) 项?

我特别考虑表达式中的lvalue to rvalue implicit conversionof 变量,上面提到的第 (10) 项中的 (a)、(b) 和 (c) 中的任何一个子句都没有涵盖该变量。xconstexpr double y = x;

谢谢您的帮助。

0 投票
0 回答
440 浏览

c++ - 如何实现编译时间获取器,以获得更简洁的调用?

我想以一种使其调用更简洁的方式实现编译时 getter。我有一个非类型 ( unsigned int N) 类模板foo,它递归地继承自foo<N - 1>. 每一个foo都有自己的enum成员number,它被初始化为其对应的值N。基本情况是foo<0>。例如,一个foo<5>对象有 6 个enum称为number,值0通过5。我想实现一个编译时 getter at,但这并不像constexpr在原型前面添加 a 那样简单:

在 g++ 4.8 中,我得到了几个错误实例:error: 'index' is not a constant expression除其他外。其余的只是跟风。即使所有客户端代码at仅使用整数文字调用,getter 也不会编译。为什么?

无论如何,我的解决方案是实现一个编译时整数包装器。它只是一个非类型 ( unsigned int N) 类模板ctint(compile-time int 的缩写),其enum成员mem被初始化为其N

因此,将foo<N>foo<0>的 getter 方法分别替换为:

作品:

但使函数调用变得冗长。我想要一个没有库的实现,除了<iostream>显示某些工作但无助于使其工作的部分(例如)。我希望 getter 能够<>在调用中选择性地省略或没有语法或拼写类型名称,但不一定在原型或定义中。我不希望它涉及array[]s。如果那是不可能的,我想知道下一个最好的方法。

0 投票
2 回答
633 浏览

c++ - 类内静态成员初始化

给定

gcc 4.8 说

错误:静态成员'S::rx'的非常量类内初始化无效

错误:(需要类外初始化)

错误:“S::rx”在声明时不能由非常量表达式初始化

我期望x是一个常量表达式,适合这样的初始化。这是一个 gcc 错误吗?如果没有,这里发生了什么?