n 4527 5.20[表达式常数]p2
条件表达式 e 是核心常量表达式,除非按照抽象机器 (1.9) 的规则对 e 进行计算,否则将计算以下表达式之一:
(2.7) — 左值到右值的转换 (4.1),除非它应用于
(2 . 7 . 1)-整数或枚举类型的非易失性glvalue,它引用一个完整的非易失性const对象,该对象具有一个在先初始化,用常量表达式初始化,或
(2.7.2) — 引用字符串文本 (2.13.5) 的子对象的非易失性 gl值,或
(2.7.3)-非易失性glvalue,指用constexpr定义的非易失对象,或指此类对象的不可变子对象,或
(2.7.4) — 文字类型的非易失性 gl值,指的是其生命周期始于 e 评估的非易失性对象;
5.20[expr.const]p5
常量表达式是一个glvalue核心常量表达式,其值引用的实体是常量表达式(定义如下)的允许结果,或者是一个prvalue核心常量表达,其值是一个对象,对于该对象及其子对象:
— 引用类型的每个非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,并且
-如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过该对象结尾的地址(5.7)、函数的地址或空指针值。
如果实体是具有静态存储持续时间的对象,不是临时对象,或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。
void foo(){
const int a = 1;//a has automatic storage duration
int b[a]{};
}
在intb[a]{}
,a
是一个id表达式,a
这是对glvalue积分常量表达式是常量表达式吗?
可以是prvalue核心常量表达式,但不能是glvalue核心常量,这也不可能。你已经在标准中找到了措辞,所以也许最好解释一下为什么规则是这样的。
void foo(){
const int a = 1;//a has automatic storage duration
static constexpr const int &ra = a;// cannot possibly be valid
}
这是无效的,因为它要求在调用foo
之前知道a的地址,然后才有任何
a
。
你的int b[a]{};
很好,因为它使用a作为prvalue核心常量表达式:它不关心
a
存储在哪里,它只关心它有什么值。
N4527 5.20【expr.const】p5 常量表达式是glvalue核心常量表达式,其值是指常量表达式(定义如下)的允许结果实体,或者是prvalue核心常量表达式,其值是对象,其中,对于该对象及其子对象: -引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,并且 -如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象结尾的地址(5.7)
整型字面值,例如42,就是常量表达式。所以,简单的数学表达式,例如,23x2-4。可以使用其来初始化const整型变量,然后将const整型变量作为新表达的一部分: const int i=23; const int two_i=i*2; const int four=4; const int forty_two=two_i-four; 使用常量表达式创建变量也可用在其他常量表达式中,有些事只能用
问题内容: 我需要计算用户在网站上花费的时间。登出时间与登出时间之间的区别是,给我类似“ X先生花了4个小时43分钟”。因此,为了存储the4小时43分钟,我这样声明: 时间NOT NULL 这是有效的还是更好的存储方式?我需要存储在数据库中,因为我还有其他计算需要将其用于+其他用例。 问题答案: 最好将其存储为整数秒数。 该会是干净和简单-即 正如Tristram所指出的,使用该字段存在局限性
问题内容: 我可以用吗: 代替 后者似乎太冗长。有区别吗? 问题答案: 该声明 将调用(请参阅特殊方法名称文档)并使用该函数的返回值。总结如下: 要求执行真值测试和内置操作;应该返回或,或者它们的整数等效值或。如果未定义此方法,则调用该方法(如果已定义),并且如果其结果为非零,则将该对象视为true。如果一个类既未定义,也未定义,则其所有实例均被视为true。 另一方面, 仅 将参考与进行比较以查
一个简单的问题:有效吗? 换句话说:赋值是一种定义良好的行为,而枚举常量的值集中不存在这种行为吗? 演示:
我遇到了一个问题,我的MySQL表有一个存储UTC时间偏移的字段。该字段为时间类型。这是出于遗留原因,我无法将列类型更改为更好的表示形式。然而,MySQL支持这一点。它允许用户在时间字段中存储负值,以表示负时差。我使用querydsl生成实体类,并将该字段映射到java。sql。时间物体。现在,当DB中有负值时,我面临一个问题。爪哇。sql。Time类将任何负值转换为前一天的时间。例如,如果DB中