A class type T must be complete if:
— an object of type T is defined , or
— a non-static class data member of type T is declared , or
— T is used as the object type or array element type in a new-expression , or
— an lvalue-to-rvalue conversion is applied to a glvalue referring to an object of type T , or
— an expression is converted (either implicitly or explicitly) to type T , or
— an expression that is not a null pointer constant, and has type other than void*, is converted to the type pointer to T or reference to T using an implicit conversion , a dynamic_cast or a static_cast , or
— a class member access operator is applied to an expression of type T , or
— the typeid operator or the sizeof operator is applied to an operand of type T, or
— a function with a return type or argument type of type T is defined or called , or
— a class with a base class of type T is defined , or
— an lvalue of type T is assigned to , or
— the type T is the subject of an alignof expression , or
— an exception-declaration has type T, reference to T, or pointer to T
目测没说 T* 的 算术运算 以及 下标访问,此外 function call 那一条遇到 decltype 的时候有个特例?(“in the case where the operand of a decltype-specifier is a function call and the return type of the function is a class type, a special rule (5.2.2) ensures that the return type is not required to be complete (as it would be if the call appeared in a sub-expression or outside of a decltype-specifier).”)
@幻の上帝 求指教
— an object of type T is defined , or
— a non-static class data member of type T is declared , or
— T is used as the object type or array element type in a new-expression , or
— an lvalue-to-rvalue conversion is applied to a glvalue referring to an object of type T , or
— an expression is converted (either implicitly or explicitly) to type T , or
— an expression that is not a null pointer constant, and has type other than void*, is converted to the type pointer to T or reference to T using an implicit conversion , a dynamic_cast or a static_cast , or
— a class member access operator is applied to an expression of type T , or
— the typeid operator or the sizeof operator is applied to an operand of type T, or
— a function with a return type or argument type of type T is defined or called , or
— a class with a base class of type T is defined , or
— an lvalue of type T is assigned to , or
— the type T is the subject of an alignof expression , or
— an exception-declaration has type T, reference to T, or pointer to T

