问题标签 [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.
c++ - 常量表达式中的条件运算符
我用 MSVC 10 尝试了以下代码片段,它工作正常。
我想知道的是:当所有操作数都是常量表达式时,C++ 标准(最好是 C++98)是否允许我在常量表达式中使用条件运算符,或者这是微软的怪癖/扩展?
.net - 表达式树如何捕获局部变量
我目前正在努力创建动态表达式,并且我有以下场景,我希望帮助实现。
给定:
所以我的问题是我不能让 MakeDynamicPredicate 返回的谓词等于 MakePredicate 函数生成的谓词。
我阅读了Jon Skeet 的回复帖子,但不明白如何实现 ConstantExpression 以便捕获局部变量...
任何帮助将不胜感激。
附加信息:以后我可能不知道正在使用的类,因此它最终将被抽象为更通用。
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
(除了编译器警告说逗号运算符无效并且x
和arr
变量未使用):
但是,必须说,即使是以下程序也可以使用该-std=c++03
选项(在 Clang 和 GCC 上)编译良好,这显然是不正确的,鉴于上述 C++03 标准的引用:
问题:
C++03 和 C++11 在常量表达式中是否允许使用逗号运算符有区别,还是我遗漏了什么?
作为一个奖励(非建设性)问题,我很想知道为什么逗号运算符不能用于 C++03 中的常量表达式。
c - 如何避免在 if 上获得“常量表达式”?
我有一个assert
可以解析为 的宏,if
如下所示:
忽略如何handle_failed_assert()
工作,你不需要引用这个do { ... } while(0)
技巧。请关注这背后的功能。
现在,真正的问题来了。有时我想强迫和断言,让它有意义。所以我们使用这个:
问题是我们有这个基于RVCT 2.2的编译器vrxcc ,它在编译时会抛出这个警告:
当然,这会解析为 compile constant if
。
我怎么能欺骗编译器接受它?
c++ - 布尔常量表达式中的冗余实例化
我有一个 n-any 布尔OR
运行时函数any_run
以及编译时类似物any_comp
两者都包含断言(分别为运行时或编译时)以确保第一个参数为真。
现在给出以下输入
运行时断言永远不会失败,但编译时断言会失败。这意味着它any_run(false, false)
永远不会被调用,但是any_comp <_false, _false>
会被实例化,尽管布尔常量表达式
可以在没有实例化的情况下评估为true
if 。A() == true
any_comp <B...>
我的问题是这个实验及其结论是否有效,以及标准对此有何看法。
这很重要,因为如果结论是有效的,我必须更仔细地重新实现几个编译时函数(具有更多的专业化)以使编译更快,尽管我通常更喜欢让事情尽可能简单。
c++ - 常量变量与常量引用
在一些 C++ 源代码中,我看到可以将表达式结果保存为常量。像这样:
这是什么意思?有这方面的任何文件吗?我找不到它。。
对我来说,它似乎相当于:
因为程序的结果保持不变。真的等价吗?
如果是,为什么该语言完全允许第一种方式来编写它?看起来很混乱。
如果没有,有什么区别?
c++ - 不能出现在常量表达式中
在以下 c++ 程序中:
我收到以下错误:“'n' 不能出现在常量表达式中”。由于我对 cpp 比较陌生,所以我真的不知道为什么会发生这个错误(特别是因为我对一个名为 vector 的类做了几乎完全相同的事情,而且根本没有问题)以及如何修复它。我真的很感激任何帮助。
c++ - 什么是 C++11 标准中的核心常量表达式?
在 C++11 标准 (N3690) 的最新草案中有 11 处对该表达式core constant expression
的引用,它们都没有定义该实体是什么。
人们还可以发现,这里core constant expression
的表达式定义得很好,基本上与标准用来定义表达式的术语相同。conditional-expression
因此,我想就这个问题获得一些意见,在我看来,这在标准中是错误的。
现在,假设cppreference中的定义是正确的,我还想知道为什么下面的代码片段在Coliru和Ideone中编译,尽管提到的定义中有第 (10) 项?
我特别考虑表达式中的lvalue to rvalue implicit conversion
of 变量,上面提到的第 (10) 项中的 (a)、(b) 和 (c) 中的任何一个子句都没有涵盖该变量。x
constexpr double y = x;
谢谢您的帮助。
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。如果那是不可能的,我想知道下一个最好的方法。
c++ - 类内静态成员初始化
给定
gcc 4.8 说
错误:静态成员'S::rx'的非常量类内初始化无效
错误:(需要类外初始化)
错误:“S::rx”在声明时不能由非常量表达式初始化
我期望x
是一个常量表达式,适合这样的初始化。这是一个 gcc 错误吗?如果没有,这里发生了什么?