[c++] C ++ 20 이후 할당 된 스토리지에서 포인터 산술이 허용됩니까?

C ++ 20 표준에서는 배열 유형이 암시 적 수명 유형이라고 합니다.

암시 적이 지 않은 수명 유형에 대한 배열을 암시 적으로 만들 수 있습니까? 이러한 배열의 암시 적 생성으로 인해 배열 요소가 생성되지 않습니까?

이 경우를 고려하십시오.

//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");

이 코드는 C ++ 20 이후로 더 이상 UB가 아닌가?


어쩌면이 방법이 더 낫습니까?

//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");



답변

암시 적이 지 않은 수명 유형에 대한 배열을 암시 적으로 만들 수 있습니까?

예.

이러한 배열의 암시 적 생성으로 인해 배열 요소가 생성되지 않습니까?

예.

이것이 std::vector일반적인 C ++에서 구현 가능 하게 만드는 것입니다.


답변