[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 ++에서 구현 가능 하게 만드는 것입니다.