所以,我正在研究这个有一些静态常量的类:
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_
常量?
是否有可能在C#中声明一个恒定的Guid?
我明白我可以声明一个static readonly Guid
,但是有一种语法允许我写const Guid
吗?
我觉得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
去从0
到n - 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
参数时的编译时间.
在以下代码中:
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) 如果我在常量表达式中除以零,我的玩具编译器会崩溃:
int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)
C和/或C++标准是否允许这种行为?
c c++ compile-time-constant divide-by-zero constant-expression
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)
编译器以与编译时常量相同的方式处理?
最后,我从答案中理解的是:
final static
表示编译时常量final
意味着它是一个常量但在运行时被初始化static
意味着在运行时初始化final
变量,不会被视为常量.我的理解是否正确?
std::string
提供了一种max_size()
方法来确定它可以包含的最大元素数.
但是,为了计算字符串的最大长度,程序员必须创建一个(可能是空的)字符串对象.
如果这个类不需要程序员的任何信息,为什么不能max_size()
作为编译时常量?字符串是否需要某种运行时信息来计算其最大大小?
当我编译下面的代码时,我收到以下错误消息:
(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) 我想为方法设置一个可选的日期参数(默认为MinValue),以检查用户是否实际提供了一个值(提供MinValue无效),但我不允许,因为它显然不是编译 - 时间常数.
根据MSDN页面,"此常量的值相当于0001年1月1日00:00:00.0000000".
那么为什么不是编译时常量?为什么它不同于传入Int32.MinValue,这是允许的?
最终变量和编译时常量之间有什么区别?
请考虑以下代码
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的其他结构需要编译时间常量?