【问题标题】:What does Note 10 mean in [basic.lval]/11?[basic.lval]/11 中的注释 10 是什么意思?
【发布时间】:2021-01-05 23:04:41
【问题描述】:

[basic.lval]/11:

如果程序尝试通过类型与以下类型之一不相似的泛左值访问对象的存储值,则行为未定义:48

(11.1) 对象的动态类型,

(11.2) 与对象的动态类型相对应的有符号或无符号类型,或

(11.3) charunsigned charstd​::​byte 类型。

如果程序为 U 类型的联合调用默认的复制/移动构造函数或复制/移动赋值运算符,并带有在其生命周期内不表示 cv U 类型的对象的左值参数,则行为未定义.

[注 10:与 C 不同,C++ 没有类类型的访问。 ——尾注]

【问题讨论】:

标签: c++ language-lawyer


【解决方案1】:

这篇笔记是最好的语言律师!

在定义其等效规则时(C99 中的第 6.5/7 节),在描述有效的别名可能性时,C 将聚合和联合类型捆绑在一起。

C++ 不这样做。将构造函数、转换运算符和继承混合在一起,类可能比 C 中的任何复合类型复杂得多,因此 C++ 举起双手说,看,我们不打算在这里处理任何这些。

相反,这些规则所描述的“访问”只能归结为内置类型。这很好,因为每种复合类型最终都是由内置类型的对象组成的。

什么构成了复杂类型的有效转换和重新解释,在其他地方有不同的规则。

这个注释只是指出了这一点。

标准词汇表中对此进行了更详细的描述:

[defns.access]: [..] [注 1: 只能访问标量类型的对象。标量对象的读取在 [conv.lval] 中描述,标量对象的修改在 [expr.ass]、[expr.post.incr] 和 [expr.pre.incr] 中描述。尝试读取或修改类类型的对象通常会调用构造函数或赋值运算符;这种调用本身并不构成访问,尽管它们可能涉及对标量子对象的访问。 ——尾注]

最终,我们真的不需要担心。

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 2018-01-02
    • 1970-01-01
    • 2010-11-29
    • 2012-06-21
    • 2021-05-04
    • 2015-03-16
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多