在if-cases泄漏中定义的变量?(又名为什么这甚至编译?)

Mac*_*cke 4 c++

似乎在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中的行为相同

Luc*_*ore 6

它确实存在,而且bNULLelse分支,并呼吁它的功能是不确定的行为.

  • 6.4/3声明在条件中引入的名称(由*type-specifier-seq*或条件的声明者引入)在其声明范围内,直到由条件控制的子语句结束.如果在由条件控制的子语句的最外面的块中重新声明该名称,则重新声明该名称的声明是不正确的.[例如:`if(int x = f()){int x; //形成错误,重新声明x} else {int x; //形成错误,重新声明x}` (2认同)