Kob*_*ban 2 c++ language-lawyer
以下C++代码是否正确?
struct Base { int x; };
struct Derived : Base { int y; }
Base * b = new Base;
Derived * d = static_cast<Derived *>(b);
//below we access only d->x, but not d->y
std::cout << d->x;
Run Code Online (Sandbox Code Playgroud)
如果没有,究竟出了什么问题?C++标准对此有何看法?至少我没见过它曾经坠毁过.
chr*_*ris 11
这在[expr.static.cast]/11(强调我的)中相当简单:
类型为"指向cv1 B的指针"的prvalue,其中B是类类型,可以转换为类型为"指向cv2 D的指针"的prvalue,其中D是从B派生的类,如果cv2是相同的cv-qualification比cv1更高的cv资格.如果B是D的虚基类或D的虚基类的基类,或者如果没有从"指向D的指针"到"指向B的指针"的有效标准转换([conv.ptr]),则程序是不正确的.空指针值将转换为目标类型的空指针值.如果"指向cv1 B的指针"类型的prvalue指向实际上是D类型对象的子对象的B,则生成的指针指向类型D的封闭对象.否则,行为未定义.
你没有a的子对象Derived,所以它是未定义的行为.
注意,对于左值或右值指针没有特殊情况,并且/ 8提到操作数经历左值到右值的转换.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |