也就是说,这种情况总是合法的吗?
struct Derived;
struct Base { Base(Derived*); };
struct Derived : Base { Derived() : Base(this) { } };
Base::Base(Derived *self) {
if(static_cast<Base*>(self) != this) std::terminate();
}
int main() {
Derived d; // is this well-defined to never call terminate?
}
在评估
static_cast
之时,self
尚未指向一个Derived
对象——该对象正在构建中。例如,如果Derived
有数据成员,则它们的构造函数将不会被调用。那么,转换仍然保证是定义良好的行为,导致一个等同于Base
的this
指针(该指针确实指向完全构造的Base
基类子对象)吗?我认为一句标准引语可以接近回答这个问题,即
[conv.ptr]/3
。“... 转换的结果是指向派生类对象的基类子对象的指针......”。
但我认为目前是没有派生类对象的,那么会发生什么呢?如果确实未定义,那么对于
self != static_cast<Derived*>(this)
是否会有变化?(Clang和GCC编译并运行此代码 "符合预期"。)
static_cast<Base*>(self)
进行解引用是否定义良好。 - spectrasstatic_cast
的时候,self
还没有指向一个Derived
对象。为什么呢?那么此时self
指向哪里呢? - Language Lawyer