似乎在if语句中声明的变量泄漏到以下语句中?
我复制粘贴了一些代码,令我惊讶的是它编译时,它应该没有!我准备提交代码并且在此之前我抓住了错误.下面是一个显示问题的工作(?)程序.
以下代码段调用不存在的对象上的函数:
#include <iostream>
class A {
public:
virtual ~A() {}
};
class B : public A {
public:
void fooB() { std::cout << "fooB\n"; }
};
class C : public A {
public:
void fooC() { std::cout << "fooC\n"; }
};
int main() {
A* a = new C();
if (B* b = dynamic_cast<B*>(a)) {
b->fooB();
} else if (C* c = dynamic_cast<C*>(a)) {
c->fooC();
b->fooB();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译并输出如下:
fooC
fooB
Run Code Online (Sandbox Code Playgroud)
这肯定是错的.我是否需要启用一些警告以防止编译此代码?
想象一下,如果我试图访问某些成员变量或调用虚函数,那就是恐怖!
VS2008和GCC 4.8中的行为相同
它确实存在,而且b是NULL在else分支,并呼吁它的功能是不确定的行为.