std::launder
is not needed when using the result of std::memcpy
Section: 27.5.1 [cstring.syn] Status: Ready Submitter: Jan Schultke Opened: 2024-04-05 Last modified: 2024-06-28
Priority: 3
View all issues with Ready status.
Discussion:
int x = 0; alignas(int) std::byte y[sizeof(int)]; int z = *static_cast<int*>(std::memcpy(y, &x, sizeof(int)));
This example should be well-defined, even without the use of std::launder
.
std::memcpy
implicitly creates an int
inside y
, and
https://www.iso-9899.info/n3047.html#7.26.2.1p3
states that
The
memcpy
function returns the value of [the destination operand].
In conjunction with 27.5.1 [cstring.syn] p3, this presumably means that std::memcpy
returns a pointer to the (first) implicitly-created object, and no use of std::launder
is necessary.
[2024-06-24; Reflector poll]
Set priority to 3 after reflector poll.
Previous resolution [SUPERSEDED]:
This wording is relative to N4971.
Modify 27.5.1 [cstring.syn] as indicated:
-3- The functions
memcpy
andmemmove
are signal-safe (17.13.5 [support.signal]). Both functions implicitly create objects (6.7.2 [intro.object]) in the destination region of storage immediately prior to copying the sequence of characters to the destination. Both functions return a pointer to a suitable created object.
[St. Louis 2024-06-26; CWG suggested improved wording]
[St. Louis 2024-06-28; LWG: move to Ready]
Proposed resolution:
This wording is relative to N4981.
Modify 27.5.1 [cstring.syn] as indicated:
-3- The functions
memcpy
andmemmove
are signal-safe (17.13.5 [support.signal]).BothEach of these functions implicitlycreatecreates objects (6.7.2 [intro.object]) in the destination region of storage immediately prior to copying the sequence of characters to the destination. Each of these functions returns a pointer to a suitable created object, if any, otherwise the value of the first parameter.