Considere este trecho de código C++23:
struct MyData {
std::int32_t value;
};
std::vector<char> read_from_net();
void send_over_net(std::vector<char>&);
...
std::vector<char> buffer = read_from_net();
std::start_lifetime_as<MyData>(buffer.data())->value = 222; // (1)
send_over_net(buffer); // (2)
Assumindo que todos os requisitos para iniciar a vida útil de MyData
at buffer.data()
sejam respeitados:
- Existe alguma UB neste código? Começar o tempo de vida assim e modificar o campo é bem definido?
- Posso acessar o buffer original como caracteres
(2)
sem UB, considerando que issostart_lifetime_as
encerrou a vida útil do objeto anterior e iniciou uma nova? - Ou
start_lifetime_as
apenas inicia outra vida, mas também preserva a anterior? - Devo usar
std::launder(buffer.data())[0]
o método de acesso ao buffer original como uma matriz de caracteres depois(2)
?