Add weak_ptr

is_default_constructible instead of has_trivial_default_constructor, and other
remove the has_trivial things


22.10.2: Templates instantiated for specific types as friends
    compare to BinopAdd 
    Also check this for e.g., friend operator+

C17 etc:

-> Template argument deduction for class templates     P0091R3
Declaring non-type template parameters with auto    P0127R2

-- all done --

Ignoring unsupported non-standard attributes    P0283R2

Using attribute namespaces without repetition   P0028R4
Dynamic memory allocation for over-aligned data     P0035R4


1--> Construction Rules for enum class variables     P0138R2

?? not found: Extending static_assert     N3928
Rewording inheriting constructors (core issue 1941 et al)   P0136R1
Make exception specifications be part of the type system    P0012R1

====================================================================

// To declare a class template as friend:
template <typename Tp1>
class Friend;

template <typename Type>
struct Base
{
    template <typename Tp1>         // to declare it as friend: use the std
    class Friend;                   // template declaration + friend

    template <typename Tp>
    static void fun()
    {};
};

    // call a static member template of a class template:
    // ==================================================
template <typename Type>
struct Der: public Base<Type>
{
    //template <typename Tp>            optional
    static void gun()
    {
        // Base<Type>::fun<int>();          won't compile
        Base<Type>::template fun<int>();
    };
};

//---------------------------------------------------------------------

template <typename Type>
struct Base
{
    template <typename Tp1>         // to declare it as friend: use the normal
    friend class Friend;            // template declaration and `friend'

    template <typename Tp>
    static void fun();


    private:
        void run();

};

template <typename Tp1>
class Friend
{
    public:
        void call(Base<Tp1> &base)
        {
            base.run();
        }
};



int main(int argc, char **argv)
{
    Friend<int> fr;
    Base<int> bi;

    fr.call(bi);
}



