No padrão C ++ 20, diz-se que os tipos de matriz são do tipo vida útil implícita .
Isso significa que uma matriz para um tipo de duração não implícita pode ser criada implicitamente? A criação implícita de tal matriz não causaria a criação dos elementos da matriz?
Considere este caso:
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");
Esse código não é mais UB desde C ++ 20?
Talvez assim seja melhor?
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to the array of 10 std::string"
std::string (* sptr)[10] = std::launder(static_cast<std::string(*)[10]>(ptr));
//pointer arithmetic on an array is well defined
new (*sptr+1) std::string("second element");
11
Acabei de pesquisar o padrão C ++ 20 (rascunho) e não encontrei nada que descreva matrizes como um "tipo de duração implícita" (e, sim, procurei por variações). Forneça uma descrição mais detalhada de sua reivindicação (por exemplo, seção e cláusula na norma). É um pouco difícil responder à sua pergunta sem conseguir encontrar a fonte, sem falar em qualquer contexto relevante.
—
Peter
@Peter: eel.is/c++draft/basic.types#9 , última frase
—
geza
Eu estava olhando o PDF open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf (ostensivamente o último rascunho de trabalho) e ele nem sequer tem essa frase. Parece que você precisará encontrar o significado de "vida implícita" também. Suspeito que seu link tenha recebido algumas "edições em andamento" que nem chegaram aos rascunhos de trabalho liberados.
—
Peter
@ Peter As alterações são o resultado da fusão do P0593 com o padrão da recente reunião de Praga. Ainda não divulgaram o rascunho resultante, mas você pode ver o texto mesclado neste commit .
—
noz