static const int a = std::random_device{}();中a是否为glvalue核心常量表达式?
关于
static const int a = std::random_device{}();中表达式a的常量表达式性质 为什么a是glvalue常量表达式?
你得把表达式a的求值过程和a的初始化过程分开来看:
- 核心常量表达式的限制针对的是表达式求值时的操作,和变量初始化阶段的操作无关。表达式
a作为标识符,求值时只是获取指向static const int对象的左值(glvalue),完全不会触发std::random_device构造函数或operator()的调用——这些操作仅发生在a的静态初始化阶段,和表达式a本身的求值逻辑没有交集。 - 按照C++标准(草案N4878),glvalue常量表达式需要满足两个条件:一是自身属于核心常量表达式,二是指向的实体是const限定的常量对象。
a是static const int类型,符合第二个条件;同时表达式a的求值未触发任何核心常量表达式的禁止操作,因此它属于glvalue常量表达式。
为什么它不是prvalue常量表达式?
如果把a当作prvalue使用(比如在int b = a;这类语境中,a会被转换为prvalue),此时需要读取a的数值,这个读取操作会违反核心常量表达式的规则:
- 标准明确规定,核心常量表达式中不允许读取未用常量表达式初始化的const限定标量对象的值。
a的初始化式std::random_device{}()不是常量表达式,因此读取a数值的操作不属于核心常量表达式范畴,对应的prvalue自然也不是prvalue常量表达式。
内容的提问来源于stack exchange,提问作者domdrag
相关产品推荐
相关产品推荐

