在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(表面上是最新的工作草案),甚至连那句话都没有。看起来您也需要找到“隐式生命”的含义。我怀疑您的链接可能包含了一些“进行中的编辑”,这些编辑甚至还没有纳入已发布的工作草案中。
—
彼得