gpt4 book ai didi

c++ - 我可以在构造函数的主体中转发构造吗?

转载 作者:可可西里 更新时间:2023-11-01 15:25:30 24 4
gpt4 key购买 nike

让我们考虑一下,在类 S 的构造函数执行期间,S 似乎可以使用另一个构造函数来构造。一种解决方案是在 this 处创建一个新的位置以重用存储空间:

struct S{
unsigned int j; //no const neither reference non static members
S(unsigned int i){/*...*/}
S(int i){
if (i>=0) {
new (this) S(static_cast<unsigned int>(i));
return;}
/*...*/
}
};
int i=10;
S x{i};//is it UB?

存储重用在 [basic.life] 中定义.当在构造函数执行期间(重新)使用存储时,我不知道如何阅读本节。

最佳答案

在这种情况下,标准完全未指定,我找不到相关的 CWG 问题。

就其本身而言,您的新展示位置并不是 UB。毕竟,你有存储没有对象,所以你可以直接在里面构造一个对象。正如您所说的那样,第一个对象的生命周期尚未开始。

但现在的问题是:原始对象发生了什么?因为通常情况下,构造函数只在没有对象的存储上调用,构造函数的结束标志着对象生命周期的开始。但是现在已经有另一个对象了。新对象被销毁了吗?没有效果吗?

该标准在 [class.cdtor] 中缺少一段说明如果在正在构造和销毁的对象的存储中创建新对象应该发生什么。

您甚至可以构建更奇怪的代码:

struct X {
X *object;
int var;
X() : object(new (this) X(4)), var(5) {} // ?!?
X(int x) : var(x) {}
} x;

关于c++ - 我可以在构造函数的主体中转发构造吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52439721/

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