title: Why can't static_cast be used to down-cast when virtual inheritance is involved?
body: <p>Consider the following code:</p>
  
  <pre><code>struct Base {};
  struct Derived : public virtual Base {};
  
  void f()
  {
      Base* b = new Derived;
      Derived* d = static_cast&lt;Derived*&gt;(b);
  }
  </code></pre>
  
  <p>This is prohibited by the standard (<code>[n3290: 5.2.9/2]</code>) so the code does not compile, because <code>Derived</code> <em>virtually</em> inherits from <code>Base</code>. Removing the <code>virtual</code> from the inheritance makes the code valid.</p>
  
  <p>What's the technical reason for this rule to exist?</p>