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");
1
방금 (초안) C ++ 20 표준을 통해 검색을 수행했으며 배열을 "암시 적 수명 유형"으로 설명하는 항목을 찾지 못했습니다 (예 : 변형 검색). 귀하의 주장에 대한 자세한 설명을 제공하십시오 (예 : 표준의 섹션 및 조항). 관련 컨텍스트는 물론 소스를 찾을 수없이 질문에 대답하기가 어렵습니다.
—
피터
@Peter : eel.is/c++draft/basic.types#9 , 마지막 문장
—
geza
나는 PDF open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf ( 명백히 최신 작업 초안)를보고 있었고 그 문장조차 없습니다. "암시 적 수명"의 의미도 찾아야 할 것 같습니다. 귀하의 링크가 공개 초안으로 작성되지 않은 일부 "수정중인 수정 사항"을 선택했을 수 있습니다.
—
피터