C++ Logo

std-proposals

Advanced search

Re: Allowing access to object representations

From: language.lawyer_at <language.lawyer_at_[hidden]>
Date: Mon, 19 Aug 2019 22:15:12 +0300
On 19/08/2019 19:33, Brian Bi wrote:
> On Sat, Aug 17, 2019 at 2:16 PM Language Lawyer via Std-Proposals <
> std-proposals_at_[hidden]> wrote:
>
>> std::bless<std::byte[sizeof(T)]> (or how it is currently named), when it
>> is added to the standard, will kinda allow accessing object representation
>> without introducing very non-trivial changes to the C++ memory and object
>> model.
>
> If I understand the std::bless approach properly, it has a serious
> shortcoming: let's say T has some sufficiently nontrivial class type. Then,
> the call to std::bless followed by reading from the std::byte array will
> create the std::byte array, which *ends the lifetime of the *T since the T's
> storage has now been reused by the std::byte array. If T is not an
> implicit-lifetime type, then that means if you still want to use the
> original T value *qua* T, then tough luck. If the T object had automatic
> storage duration and a nontrivial destructor, then UB will happen when it
> goes out of scope.

Right, you'll need to recreate an object of type T using std::bless<T> when you're done accessing the array.
(Note that you'll have to do this even if T is an implicit-lifetime type!)

> None of this would be a problem if we could just go back to the C++14
> paradigm where we all agreed that every object of type T effectively
> overlays objects of type char[T] and unsigned char[T] at the same address
> (cf. CWG 1314).

I do not think that this is a good way.

Received on 2019-08-19 14:17:16