这是 basic.def.odr 部分的缺陷吗?

Is it a defect in basic.def.odr section

本文关键字:缺陷 basic def odr 这是      更新时间:2023-10-16
struct S { static const int x = 0; };
int main(){
S obj;
int v = obj.x;
}

考虑上面的代码,obj.x是odr使用吗? 根据查看 basic.def.odr#3 的部分

名称显示为潜在计算表达式ex 的变量 x 由 ex 使用 odr,除非对 x 应用左值到右值的转换会产生一个不调用任何非平凡函数的常量表达式,并且如果 x 是一个对象,则 ex 是表达式 e 的潜在结果集的一个元素,其中左值到右值的转换应用于e, 或 e 是丢弃值表达式。

我们有如下分析:

在我的代码中,变量名是 x,它是上面引用中的 x,表达式obj.x是引用中的 ex。那么,obj.x是一个潜在评估的表达式吗?是的,因为它

: 表达式

可能会被计算,除非它是未计算的操作数或其子表达式。

obj.x既不是未计算的操作数,也不是其子表达式。因此,obj.x是一个潜在评估的表达式。应用左值到右值x确实会产生一个常量表达式,因为它是由0初始化的。我怀疑的是以下几点,即

并且,如果 x 是一个对象,则 ex 是表达式e的潜在结果集合中的一个元素

我们假设 E 是obj.x,因为左值到右值的转换将适用于它。e的潜在结果集是什么?如下:
basic.def.odr#2

表达式 e 的潜在结果集定义如下:

  • 如果 e 是类成员访问表达式,则该集合包含对象表达式的潜在结果。

因为 e 是一个类成员访问表达式。 因此,它的潜在结果集是对象表达式。

expr.ref#3

将后缀 expression.id 表达式缩写为 E1。E2,E1称为对象表达式。

所以,这里的对象表达式是obj的,因此表达式obj.x的潜在结果集合包含obj。显然,这里的 ex 是 xand if e isobj.xthen its set of potential results of expression would beobj. So, what the expressioneof which the exx' 是一组潜在结果的元素?根据查看basic.def.odr#2,我什么也没找到。

我非常确定左值到右值的转换应用于整个表达式obj.x。但是,所有编译器都同意使用obj.x不是 odr 使用。是标准的缺陷吗?

你不能依靠编译器来告诉你它是否是odr-use;如果是,并且你没有定义变量,程序的格式不正确,不需要诊断。 也就是说,这似乎是 C++17 中的一个缺陷,因为忽略了引用具有类成员访问权限(而不是限定 id(的静态成员变量的可能性。