标签: compile-time-constant

Java switch语句:需要常量表达式,但它是常量

所以,我正在研究这个有一些静态常量的类:

public abstract class Foo {
    ...
    public static final int BAR;
    public static final int BAZ;
    public static final int BAM;
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我想要一种基于常量获取相关字符串的方法:

public static String lookup(int constant) {
    switch (constant) {
        case Foo.BAR: return "bar";
        case Foo.BAZ: return "baz";
        case Foo.BAM: return "bam";
        default: return "unknown";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我编译时,我constant expression required在每个3个案例标签上都会出错.

我知道编译器需要在编译时知道表达式来编译一个开关,但为什么不是Foo.BA_常量?

java compile-time-constant

159
推荐指数
7
解决办法
19万
查看次数

如何在C#中声明一个常量Guid?

是否有可能在C#中声明一个恒定的Guid?

我明白我可以声明一个static readonly Guid,但是有一种语法允许我写const Guid吗?

c# guid const constants compile-time-constant

51
推荐指数
5
解决办法
4万
查看次数

constexpr重载

相关:函数返回constexpr无法编译

我觉得constexpr在C++ 11中的用处有限,因为无法定义两个本来具有相同签名的函数,但有一个是constexpr而另一个不是constexpr.换句话说,如果我有一个constexpr std :: string构造函数只接受constexpr参数,并且非constexpr std :: string构造函数用于非constexpr参数,那将非常有用.另一个例子是理论上复杂的功能,通过使用状态可以提高效率.使用constexpr函数你不能轻易做到这一点,所以你有两个选择:如果你传入非constexpr参数,那么constexpr函数非常慢,或者完全放弃constexpr(或写两个单独的函数,但你可能不知道要调用哪个版本).

因此,我的问题是:

是否有可能符合标准的C++ 11实现允许基于constexpr参数的函数重载,或者这需要更新标准?如果不允许,是否故意不允许?


@NicolBolas:假设我有一个映射enum到a 的函数std::string.最直接的方式做到这一点,假设我enum去从0n - 1,是创建一个大小的数组n充满了结果.

我可以创建一个static constexpr char const * []并构造一个std::string返回(std::string每次调用函数时支付创建对象的成本),或者我可以创建一个static std::string const []并返回我查找的值,std::string第一次支付所有构造函数的成本调用该函数.似乎更好的解决方案是std::string在编译时创建内存(类似于现在所做的char const *),但是执行此操作的唯一方法是警告构造函数它有constexpr参数.

对于一个除了std::string构造函数之外的例子,我认为找到一个例子是非常简单的,如果你可以忽略constexpr(并因此创建一个非constexpr函数)的要求,你可以创建一个更有效的函数.考虑一下这个帖子:constexpr问题,为什么这两个不同的程序用g ++在不同的时间内运行?

如果我fib用一个constexpr参数调用,我不能比编译器完全优化掉函数调用做得更好.但是,如果我fib使用非constexpr参数调用,我可能希望让它调用我自己的版本来实现memoization(这将需要状态)之类的东西,所以我得到的运行时间类似于我通过constexpr参数时的编译时间.

c++ overloading compile-time-constant constexpr c++11

45
推荐指数
5
解决办法
8601
查看次数

为什么最终变量不总是一个常量表达式?

在以下代码中:

final int a;
a=2;
byte b=a;   // error: possible loss of precision
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?是不是a最终变量编译时常量表达式,因此在赋值期间隐式缩小为字节?

换句话说,上面的代码不等同于:

final int a=2;
byte b=a;
Run Code Online (Sandbox Code Playgroud)

java expression constants compile-time-constant narrowing

44
推荐指数
2
解决办法
1804
查看次数

在常量表达式中除以零

如果我在常量表达式中除以零,我的玩具编译器会崩溃:

int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)

C和/或C++标准是否允许这种行为?

c c++ compile-time-constant divide-by-zero constant-expression

43
推荐指数
3
解决办法
4102
查看次数

编译时常量和变量

Java语言文档说:

如果将基本类型或字符串定义为常量并且在编译时已知该值,则编译器会将代码中的常量名称替换为其值.这称为编译时常量.

我的理解是,如果我们有一段代码:

private final int x = 10;
Run Code Online (Sandbox Code Playgroud)

然后,编译器将x用文字替换代码中的每个匹配项10.


但假设常量在运行时初始化:

private final int x = getX(); // here getX() returns an integer value at run-time.
Run Code Online (Sandbox Code Playgroud)

与编译时常量相比,是否会出现性能下降(无论可能忽略不计)?


另一个问题是以下代码行:

private int y = 10; // here y is not final
Run Code Online (Sandbox Code Playgroud)

编译器以与编译时常量相同的方式处理?


最后,我从答案中理解的是:

  1. final static 表示编译时常量
  2. 只是final意味着它是一个常量但在运行时被初始化
  3. 只是static意味着在运行时初始化
  4. 不是final变量,不会被视为常量.

我的理解是否正确?

java performance final constants compile-time-constant

37
推荐指数
2
解决办法
3万
查看次数

为什么std :: string :: max_size不是编译时常量?

std::string提供了一种max_size()方法来确定它可以包含的最大元素数.

但是,为了计算字符串的最大长度,程序员必须创建一个(可能是空的)字符串对象.

如果这个类不需要程序员的任何信息,为什么不能max_size()作为编译时常量?字符串是否需要某种运行时信息来计算其最大大小?

c++ string compile-time-constant

33
推荐指数
3
解决办法
2654
查看次数

M_PI标记为未声明的标识符

当我编译下面的代码时,我收到以下错误消息:

(Error  1   error C2065: 'M_PI' : undeclared identifier 
2   IntelliSense: identifier "M_PI" is undefined)
Run Code Online (Sandbox Code Playgroud)

这是什么?

#include <iostream>
#include <math.h>

using namespace std;

double my_sqrt1( double n );`enter code here`

int main() {
double k[5] = {-100, -10, -1, 10, 100};
int i;

for ( i = 0; i < 5; i++ ) {
    double val = M_PI * pow( 10.0, k[i] );
    cout << "n: "
         << val
         << "\tmysqrt: "
         << my_sqrt1(val)
         << "\tsqrt: "
         << sqrt(val)
         << …
Run Code Online (Sandbox Code Playgroud)

c++ development-environment compile-time-constant

28
推荐指数
5
解决办法
6万
查看次数

C# - 为什么DateTime.MinValue和MaxValue不是编译时常量?

我想为方法设置一个可选的日期参数(默认为MinValue),以检查用户是否实际提供了一个值(提供MinValue无效),但我不允许,因为它显然不是编译 - 时间常数.

根据MSDN页面,"此常量的值相当于0001年1月1日00:00:00.0000000".

那么为什么不是编译时常量?为什么它不同于传入Int32.MinValue,这是允许的?

c# datetime compile-time-constant

27
推荐指数
2
解决办法
4717
查看次数

最终变量和编译时常量之间的差异

最终变量和编译时常量之间有什么区别?

请考虑以下代码

final int a = 5;
final int b;
b=6;
int x=0;
switch(x)
{
     case a: //no error
     case b: //compiler error
}
Run Code Online (Sandbox Code Playgroud)

这是什么意思?何时以及如何为最终变量赋值?运行时会发生什么以及编译时会发生什么?我们为什么要给switch一个编译时常量?java的其他结构需要编译时间常量?

java compile-time-constant

26
推荐指数
2
解决办法
8093
查看次数