c++ - 我可以在构造函数的主体中转发构造吗?
问题描述
让我们考虑在一个类的构造函数执行期间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;
推荐阅读
- java - 如何在 Spring Web 应用程序中找到 application.properties,而位置被提及为 classpath:/application.properties 但文件丢失?
- jquery - 当zapier触发webhook时,Ajax jquery POST命令不在webhook中执行
- php - 使额外的搜索查询实现 OR 而不是 AND
- c# - 这个异常格式化函数在内置的 ToString() 方法上添加了什么值
- python-3.x - 带有 datetime mofule 的 python 程序
- react-native - 来自 JS React Native 异步存储的格式错误的调用
- javascript - 如何通过烧瓶网站更改电脑或手机的壁纸?
- postgresql - 我们如何在 postgresql 中读取环境变量
- html - 如何使用 CSS 网格制作垄断板?
- stream - 使用度量的 Flink 事件计数