365得票3回答
std::launder的目的是什么?

P0137介绍了函数模板std::launder并对有关联合、生命周期和指针的标准进行了许多重大更改。 这篇论文解决了什么问题?我需要注意哪些语言上的更改?我们要进行什么样的launder操作?

37得票1回答
为什么要引入`std::launder`而不是让编译器处理它?

我刚刚阅读了std::launder的用途是什么? 老实说,我现在有点摸不着头脑。 让我们从@NicolBolas的回答中第二个示例开始: aligned_storage<sizeof(int), alignof(int)>::type data; new(&data)...

29得票1回答
在标准布局对象内进行指针算术运算时(例如使用offsetof),我们是否需要使用std::launder?

这个问题是对在不实际指向字符数组的情况下,给“char *”指针添加内容是否未定义行为?的后续提问。 在CWG 1314中,CWG确认在标准布局对象内使用无符号字符指针进行指针运算是合法的。这似乎意味着与链接问题中类似的一些代码应该按预期工作。 struct Foo { float...

21得票1回答
自C++17以来,使用std::launder来“验证”非“指向对象”的指针值。

根据这个答案,自从C++17以来,即使一个指针有正确的地址和正确的类型,解引用它也可能导致未定义行为。 alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1...

17得票1回答
如何解释std::launder的可达性要求?

std::launder函数要求通过结果可以访问的每个字节都可以通过参数访问。如果一个指向对象Y的指针值可以到达存储器中的一个字节,那么该存储器中的字节就是可到达的。如果Y是一个数组元素,则可到达的是它所占用的存储器或与Y可互换指针的对象。根据另一个问题的答案,该限制意味着“你不能使用laun...

15得票2回答
std::launder能否用于将对象指针转换为其所在数组的指针?

当前的草案标准(以及预计的C++17)在[basic.compound/4]中提到: [注意:数组对象及其第一个元素虽然具有相同的地址,但它们不能互相转换为指针。— 结束注意事项 —] 因此,一个对象的指针不能通过reinterpret_cast转换为其所在的数组指针。 现在,有了s...

14得票1回答
std::launder的替代方案(适用于C++17之前)

这就像是std::optional,但不会存储额外的bool值。用户必须确保在初始化后才能访问。 template<class T> union FakeOptional { //Could be a normal struct in which case will need s...

13得票2回答
在具有引用字段的类上使用定位new

这是来自C++20规范的代码示例([basic.life]/8): struct C { int i; void f(); const C& operator=( const C& ); }; const C& C::operator=( const C...

9得票1回答
使用定位new会启动对象的生命周期吗?

以下代码示例来自cppreference上的std::launder: alignas(Y) std::byte s[sizeof(Y)]; Y* q = new(&s) Y{2}; const int f = reinterpret_cast<Y*>(&s)...

8得票1回答
为什么这个std::launder示例是未定义行为?

这是我不理解的示例部分: struct Y { int z; }; int main() { alignas(Y) std::byte s[sizeof(Y)]; Y *q = new (&s) Y{2}; const int f = reinterp...