Date: Mon, 22 May 2023 09:44:15 -0400
On Mon, May 22, 2023 at 6:53 AM Oleksandr Koval via Std-Proposals
<std-proposals_at_[hidden]> wrote:
>>
>> That pair holds the "first" data member with type const T1. That's very much a const object.
>
> Hm, I thought that because it's inside a struct, it's actually a "subobject", not an "object". I always understood const_cast rule in a way that you can change const-ness as long as the underlying memory is not a read-only and I don't understand how it's possible to have a struct which has some members of it in a read-only memory and others in a read-write one.
As far as the standard is concerned, there is no such thing as
"read-only memory". There are objects which are declared `const`, and
objects which are not.
[dcl.type.cv]/4 says:
> Any attempt to modify ([expr.ass], [expr.post.incr], [expr.pre.incr]) a const object ([basic.type.qualifier]) during its lifetime ([basic.life]) results in undefined behavior.
And [basic.type.qualifier] says:
> A const object is an object of type const T or a non-mutable subobject of a const object.
None of these require the object to be a "complete object" (the
standard terminology for an object that isn't a subobject of some
object). Subobjects are objects, so this rule applies to them too.
<std-proposals_at_[hidden]> wrote:
>>
>> That pair holds the "first" data member with type const T1. That's very much a const object.
>
> Hm, I thought that because it's inside a struct, it's actually a "subobject", not an "object". I always understood const_cast rule in a way that you can change const-ness as long as the underlying memory is not a read-only and I don't understand how it's possible to have a struct which has some members of it in a read-only memory and others in a read-write one.
As far as the standard is concerned, there is no such thing as
"read-only memory". There are objects which are declared `const`, and
objects which are not.
[dcl.type.cv]/4 says:
> Any attempt to modify ([expr.ass], [expr.post.incr], [expr.pre.incr]) a const object ([basic.type.qualifier]) during its lifetime ([basic.life]) results in undefined behavior.
And [basic.type.qualifier] says:
> A const object is an object of type const T or a non-mutable subobject of a const object.
None of these require the object to be a "complete object" (the
standard terminology for an object that isn't a subobject of some
object). Subobjects are objects, so this rule applies to them too.
Received on 2023-05-22 13:44:27