C++ 自C++;20?

C++ 自C++;20?,c++,arrays,dynamic-arrays,lifetime,c++20,C++,Arrays,Dynamic Arrays,Lifetime,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

在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");
//隐式创建std::string数组
//但不是std::string元素:
void*ptr=新运算符(sizeof(std::string)*10);
//使用流槽获取“指向对象的指针”(哪个对象?)
std::string*sptr=std::流槽(静态(ptr));
//未创建的数组元素上的指针算法定义良好?
新的(sptr+1)标准::字符串(“第二个元素”);
自从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::string数组
//但不是std::string元素:
void*ptr=新运算符(sizeof(std::string)*10);
//使用流槽获取“指向10 std::string数组的指针”
标准::字符串(*sptr)[10]=标准::流槽(静态(ptr));
//数组上的指针算法定义良好
新(*sptr+1)标准::字符串(“第二个元素”);
这是否意味着可以隐式创建非隐式生存期类型的数组

隐式创建这样一个数组不会导致创建数组的元素吗


<>这就是为什么在普通C++中实现的代码< ST/::vector < /C> >。我刚刚通过(草案)C++ 20标准进行了搜索,没有发现任何描述数组是“隐式生存类型”(并且,是的,我搜索了变体)。请提供更详细的索赔说明(例如标准中的章节和条款)。在找不到来源的情况下回答你的问题有点困难,更不用说任何相关的上下文了。@Peter:,最后一句话我在看PDF(表面上是最新的工作草案),它甚至没有那个句子。看起来你也需要找到“隐式生命”的含义。我怀疑您的链接可能拾取了一些“正在进行的编辑”,这些编辑甚至还没有进入发布的工作草案。@Peter这些更改是最近布拉格会议合并到标准中的结果。他们还没有发布最终的草稿,但您可以看到合并的措辞。@Oliv哪里的引语说“void*ptr=operator new(sizeof(std::string)*10);”将创建std::string类型的数组?[expr.new]没有这样说。您能否确认
std::launder(static_cast(ptr))
没有返回指向数组第一个元素的指针,因为它不在其生存期内,但
std::launder(static_cast(ptr))
返回指向数组的指针,因为数组在它的生命周期内?@Oliv,我想实际上不需要
std::launder
,因为保证
ptr
将已经指向数组?@walnut,我错过了。因此,将
静态转换为
std::string(*)[10]
就足够了!tx.@Oliv但我想问题是,没有
std::launder
的第一个示例是否会得到很好的定义。没有要指向的
std::string
对象,但是
ptr
可以指向数组,因此静态强制转换将保持值不变,
sptr
也将指向数组。对于
std::launder
来说,这仅仅是因为
std::launder
的要求。@walnut确实,这种循环的必要性是
std::launder
。这使代码更具可读性。