title: Is there a specific reason why a trailing-return-type is not a complete-class context of a class?
body: <p>Note that a <em>trailing-return-type</em> is not mentioned in <a href="http://eel.is/c++draft/class.mem#6" rel="noreferrer">[class.mem]p6</a></p>
  <blockquote>
  <p>A complete-class context of a class is a</p>
  <p>(6.1) function body,<br />
  (6.2) default argument,<br />
  (6.3) noexcept-specifier ([except.spec]),<br />
  (6.4) contract condition, or<br />
  (6.5) default member initializer</p>
  <p>within the member-specification of the class. [ Note: A complete-class
  context of a nested class is also a complete-class context of any
  enclosing class, if the nested class is defined within the
  member-specification of the enclosing class. — end note ]</p>
  </blockquote>
  <p><a href="http://eel.is/c++draft/expr.prim#this-2" rel="noreferrer">[expr.prim.this]p2</a> also has a note about this:</p>
  <blockquote>
  <p>If a declaration declares a member function or member function
  template of a class X, the expression this is a prvalue of type
  “pointer to cv-qualifier-seq X” between the optional cv-qualifier-seq
  and the end of the function-definition, member-declarator, or
  declarator. It shall not appear before the optional cv-qualifier-seq
  and it shall not appear within the declaration of a static member
  function (although its type and value category are defined within a
  static member function as they are within a non-static member
  function). [ Note: This is because declaration matching does not occur
  until the complete declarator is known. — end note ] [ Note: <strong>In a
  trailing-return-type, the class being defined is not required to be
  complete for purposes of class member access. Class members declared
  later are not visible.</strong> [ Example: ...</p>
  </blockquote>