Tag: 编译时常量

constexpr超载

相关: 函数返回constexpr不编译 我觉得constexpr在C ++ 11中的用处是有限的,因为它不能定义两个函数,否则它们会有相同的签名,但是一个是constexpr,另一个是不是constexpr。 换句话说,如果我可以有一个constexst std :: string构造函数,它只需要constexpr参数,而一个非constexpr std :: string构造函数用于非constexpr参数将是非常有帮助的。 另一个例子是理论上复杂的函数,可以通过使用状态来提高效率。 你不能用constexpr函数轻松做到这一点,所以你只剩下两个select:如果你传递了非constexpr参数,或者完全放弃了constexpr(或者写了两个单独的函数,但你可能不知道要调用哪个版本)。 因此,我的问题是: 标准兼容的C ++ 11实现是否可以允许基于constexpr参数的函数重载,还是需要更新标准呢? 如果不允许,是否故意不允许? @NicolBolas:说我有一个函数,将一个enum映射到一个std::string 。 假设我的enum从0到n – 1 ,最直接的方法是创build一个大小为n的数组,填充结果。 我可以创build一个static constexpr char const * []并在返回时构造一个std::string (每次调用该函数时支付创build一个std::string对象的代价),或者我可以创build一个static std::string const []并返回我查找的值,在第一次调用函数时支付所有std::string构造函数的代价。 看起来更好的解决scheme是在编译时在内存中创buildstd::string (类似于char const *所做的),但唯一的方法是提醒构造函数它有constexpr参数。 除了std::string构造函数以外,我认为find一个例子,如果你可以忽略constexpr的需求(从而创build一个非constexpr函数),那么你可以创build一个更多的例子高效的function。 考虑这个线程: constexpr问题,为什么这两个不同的程序在g ++中运行的时间不同? 如果我用一个constexpr参数来调用fib ,那么我完全可以比编译器优化掉函数调用来做得更好。 但是如果我用一个非constexpr参数来调用fib ,我可能希望让它调用我自己的版本来实现像memoization(这将需要状态),所以我得到的运行时间类似于我通过编译的时间一个constexpr论据。

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

是否有可能在C#中声明一个常量Guid? 我明白,我可以声明一个static readonly Guid ,但有没有一个语法,让我写const Guid ?

用常量expression式除以零

我的玩具编译器崩溃,如果我用一个常量expression式除以零: int x = 1 / 0; C和/或C ++标准允许这种行为吗?

为什么不是最终的variables总是一个常量expression式?

在下面的代码中: final int a; a=2; byte b=a; // error: possible loss of precision 为什么我得到这个错误? 是不是a最终variables编译时间常量expression式,因此在赋值过程中隐式缩小到字节? 换句话说不是上面的代码等价于: final int a=2; byte b=a;

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

所以,我正在研究这个有几个静态常量的类: public abstract class Foo { … public static final int BAR; public static final int BAZ; public static final int BAM; … } 然后,我想一个方法来获得一个相关的string基于常量: 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"; } } 但是,当我编译时,我得到了每个3个案例标签的constant expression required错误。 我知道编译器需要在编译时知道expression式来编译开关,但为什么不是Foo.BA_常量?