【发布时间】:2016-07-24 03:57:47
【问题描述】:
const-vs-constexpr-on-variables
这家伙关于 constexpr 的说法是正确的 if double 被使用(或 float 当然)。但是,如果您将 var 类型从 double 更改为整数类型,如 int、char 等,则一切正常。为什么会这样?
int main()
{
const int PI1 = 3;
constexpr int PI2 = 3;
constexpr int PI3 = PI1; // works
static_assert(PI1 == 3, ""); // works
const double PI1__ = 3.0;
constexpr double PI2__ = 3.0;
constexpr double PI3__ = PI1__; // error
static_assert(PI1__ == 3.0, ""); // error
return 0;
}
Update:下面这行写错了,我的意思是PI3__ = PI1__
constexpr double PI3__ = PI1; // I meant PI1__
问题:
为什么
const int = 3是编译时间常数而const double = 3.0不是?有什么理由我应该使用
constexpr const int val;而不是constexpr int val?他们似乎都做同样的事情。
【问题讨论】:
-
您使用哪种编译器?
static_assert(PI1__ == 3, "");不允许 sincPI1__不是编译时常量。 -
@HelloWorld 我知道这行不通。我的问题是为什么将其更改为 int 使其工作。我正在使用 GCC 5.1 和 VS 2015 Update 2。
-
因为按照标准
const int是编译时间常数,但const double不是。 -
@SergeyA 标准在哪里这么说。这就是我感到困惑的部分。为什么 const int 是编译时间常数而 const double 不是,这在我看来没有意义。
-
@Phantom,在答案中回答。