So apparently C++20 is getting std::to_address
.
From the cppreference page its use case doesn't seem clear to me. We already have operator&
and std::addressof
, why do we need yet another function that gives us an address to its argument?
So apparently C++20 is getting std::to_address
.
From the cppreference page its use case doesn't seem clear to me. We already have operator&
and std::addressof
, why do we need yet another function that gives us an address to its argument?
std::addressof
takes an object and gets its address, even if unary "addressof operator" (aka &
) was overloaded.
std::to_address
takes a pointer, smart or dumb, and returns a pointer.
Basically when writing the std library, in this case allocators, implementors find they needed this utility function. It is small, simple, and has to be written whenever someone wants to work with allocators. So they wrote a no-brainer proposal to add it.
There are some traps here; you cannot do std::addressof(*ptr)
because *ptr
isn't always an object yet. There is already a trait that solves this, but writing code using traits directly is annoying.
Why this when they haven't finished your favourite feature? Like networking?
In comparison, networking is not a no-brainer proposal. And the current design depends on executors (basically abstractions of the concept of thread pools). The goal of writing a high level library that offers hand crafted C/ASM performance makes writing networking harder than a 2 line utility function.
Then somebody complains that they take 15 minutes to approve a no-brainer utility function, because the multiple programmer year epic proposal isn't in yet. The injustice.
Or something like that.
std
. Just add it to std::we_are_cool_lib_writers
or something. –
Benzvi std::interesting_thing
as portable C++, people wanting to write interesting_thing_with_important_difference
complain that they can't do what std
does. E.g. std::vector
needs some magic to create an array from a bunch of adjacent objects, and that can't be replicated in user code. –
Wenona *ptr isn't always an object yet
with an example: int *p = new int{42}; int *wild_p = p + 10000000;
. std::addressof(*wild_p)
dereferences wild_p
in order to bind the object there to the parameter of addressof
, causing immediate undefined behavior. While std::toaddress(wild_p)
is perfectly valid. –
Firstrate © 2022 - 2024 — McMap. All rights reserved.
std
but we still have no networking library forstd
, quite sad. – Benzvistd::addressof
requires the object to be already constructed. – Demonstd::to_address
. – Freitag