#include <iostream>

struct A
{
    void foo() { std::cout << "A::foo()\n" ; }
    void foo() const { std::cout << "A::foo() const\n" ; }
};

template < typename T > struct B
{
    private: typename std::remove_const<T>::type private_data ;
    public: T& public_data = private_data ;
};

int main()
{
    B<A> x ; x.public_data.foo() ; // A::foo()

    B<const A> y ; y.public_data.foo() ; // A::foo() const
}
