这是 basic.def.odr 部分的缺陷吗?
Is it a defect in basic.def.odr section
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 is
obj.xthen its set of potential results of expression would be
obj. So, what the expression
eof which the ex
x' 是一组潜在结果的元素?根据查看basic.def.odr#2,我什么也没找到。
我非常确定左值到右值的转换应用于整个表达式obj.x
。但是,所有编译器都同意使用obj.x
不是 odr 使用。是标准的缺陷吗?
你不能依靠编译器来告诉你它是否是odr-use;如果是,并且你没有定义变量,程序的格式不正确,不需要诊断。 也就是说,这似乎是 C++17 中的一个缺陷,因为忽略了引用具有类成员访问权限(而不是限定 id(的静态成员变量的可能性。
- 当基类是依赖类型时,这是一个缺陷吗
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 这是 basic.def.odr 部分的缺陷吗?
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 当子类需要在 c++ 中相互包含时,继承有缺陷
- 未定义的对象(〔basic.life〕/8):为什么允许引用重新绑定(和常量修改)
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 无法打印完整的二叉搜索树,因为我从最低节点向后迭代的逻辑有缺陷
- C++标准在[basic.scope.hiding]中"same scope"到底意味着什么?
- 为什么我们需要 [basic.scope.class]/2?
- [basic.lookup]/1 中最后一句话是什么意思?
- 为什么在解雇方面没有seg缺陷?unique_ptr
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- OpenGL 缺陷 - 不需要的插值
- TagniFi的HTTPS Basic Authentication 在 Qt 中失败
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- 这是 std::get ( const<T> std::p air<const T, U>& ) 由于 const T 而无法编译的C++缺陷吗?
- clang实现char8_t的方式是否存在缺陷,或者标准的某个黑暗角落是否禁止优化?