gpt4 book ai didi

c++ - 自 C++20 以来,是否允许对分配的存储进行指针运算?

转载 作者:行者123 更新时间:2023-12-04 11:43:29 26 4
gpt4 key购买 nike

在 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 object" (actually not necessary)
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");

TC 回答 + 评论结论:
  • 未创建数组元素但已创建数组
  • launder的使用在第一个例子中导致 UB,并且是
    在第二个例子中没有必要。

  • 正确的代码是:
        //implicit creation of an array of std::string 
    //but not the std::string elements:
    void * ptr = operator new(sizeof (std::string) * 10);
    //the pointer already points to the implicitly created object
    //so casting is enough
    std::string (* sptr)[10] = static_cast<std::string(*)[10]>(ptr);
    //pointer arithmetic on an array is well defined
    new (*sptr+1) std::string("second element");

    最佳答案

    Does it means that an array to a non implicit lifetime type can be implicitly created?



    是的。

    The implicit creation of such an array would not cause creation of the array's elements?



    是的。

    这就是 std::vector可以在普通 C++ 中实现。

    关于c++ - 自 C++20 以来,是否允许对分配的存储进行指针运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68995437/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com