我的理解是隐式创建隐式生存期对象的规则只适用于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;
}
1条答案
按热度按时间t40tm48m1#
回答我自己的问题:根据注解,下面的任何一个固定函数在C++17和更早版本中都是可以的。