是否可以在构造函数之前调用C++对象实例的析构函数?如果是这样,怎么样?

DLR*_*ave 5 c++ c++11

是否可以在构造函数之前调用C++对象实例的析构函数?

并不是说我真的想要这样做,但我想知道如果它确实是一个编译器错误的指示,或者是否有一种方法让一些错误的C++代码导致这种明显不正确的行为(即使它是一个人为的例子).

当我注意到在时间记录构造函数/析构函数对中测量时间的模式时,我想知道这一点,并且代码包含隐含的假设:析构函数时间> =构造函数时间.

假设相同的时钟,这个假设总是正确的......如果违反了,我会怀疑在怀疑编译器错误之前出现时钟"问题".

所以......有可能吗?如果是这样,怎么样?

Ded*_*tor 5

是的,确定你能做到.这只是UB.
最简单的方法是调用dtor,无论如何都要明确管理它的生命周期:

union{std::vector<int> v;}; // This disables automatic dtor/ctor calls. Needs C++11
v.~vector<int>();
Run Code Online (Sandbox Code Playgroud)

只有当ctor和/或dtor是微不足道的(也就是无所事事)时,才能在对象之前调用dtor.
也称为,始终初始化对象.

我实际上并不知道有什么理由打电话给dtor,但从不/在ctor之前.
虽然可以想到你想要避免打电话的情况.

无论如何,您可能希望确保使用单调时钟源,例如本地时间(或系统时钟)可以并且偶尔向后调整(DST,时钟偏差).

  • @ 0x499602D2通过把它放在一个联合中ctor不会被调用是我最好的猜测.如果你只创建一个没有联合的变量,那么将调用ctor. (2认同)