在C++17中使用placement-new显式创建带有普通默认构造函数的对象

qc6wkl3g  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(111)

我的理解是隐式创建隐式生存期对象的规则只适用于C20及更高版本。我被C17卡住了,所以我想知道是否可以通过添加一个不初始化对象的placement-new表达式来修复这个示例代码(这样它在C++17中就不是UB了),如下所示:

#include <cstdlib>
#include <new>

struct X { int a, b; };

// I believe writing to the fields of the returned object is UB in C++17, OK in C++20 and later.
X* make_uninitialized_x() {
    auto p = (X*)std::malloc(sizeof(X));
    return p;
}

// Is writing to the fields of the returned object OK in C++17 and earlier?
X* make_uninitialized_x_fixed_for_cpp17() {
    auto p = (X*)std::malloc(sizeof(X));
    new (p) X;  // This gets optimized away with -O1 flag
    return p;
}
t40tm48m

t40tm48m1#

回答我自己的问题:根据注解,下面的任何一个固定函数在C++17和更早版本中都是可以的。

#include <cstdlib>
#include <new>

struct X { int a, b; };

X* make_uninitialized_x_fixed_v1() {
    auto p = (X*)std::malloc(sizeof(X));
    new (p) X;
    return std::launder(p);
}

X* make_uninitialized_x_fixed_v2() {
    auto p = (X*)std::malloc(sizeof(X));
    return new (p) X;
}

相关问题