title: c++ crosswise covariant: return type differs due to incomplete type
body: <p>I am experimenting with covariance and came up with the following example that does at least not compile with clang 11 and on VS2015:</p>
  <pre><code>class Number {
  public:
      virtual ~Number () = default;
      virtual Number const * increment()const = 0;
  };
  
  class Even;
  
  class Odd : public Number {
  public:
      // error: increment() is not covariant because Even is incomplete
      Even const * increment()const; 
  };
  
  class Even : public Number {
  public:
      Odd const * increment()const;
  };
  </code></pre>
  <p>It is related to <a href="https://stackoverflow.com/questions/38533734/covariant-return-types-const-ness-and-incomplete-classes">Covariant return types, const-ness, and incomplete classes</a> but not a duplicate because the constness is the same in both overwritten functions.</p>
  <p>Is that even supported by the standard?</p>
  <p>Is there a way to get around this problem or any suggestions to achieve a similar behavior?</p>