#include <typeinfo>
#include <iostream>

class T
{
	virtual void foo() = 0;
};

int main() {
	int* pY1 = 0;
	const int* pY2 = 0;
	
	std::cout << "pY1: " << typeid(pY1).name() << std::endl;
	std::cout << "pY2: " << typeid(pY2).name() << std::endl;
	std::cout << "*pY1: " << typeid(*pY1).name() << std::endl;
	std::cout << "*pY2: " << typeid(*pY2).name() << std::endl;
	
	//*pY1 = 0;
	//*pY2 = 0; //error
	
	int x1 = 0;
	const int x2 = 0;
	
	std::cout << " x1: " << typeid(x1).name() << std::endl;
	std::cout << " x2: " << typeid(x2).name() << std::endl;
	
	int z1 = 0;
	const int z2 = 0;
	
	std::cout << "&z1: " << typeid(&z1).name( ) << std::endl;
	std::cout << "&z2: " << typeid(&z2).name( ) << std::endl;
	
	int* pZ1 = &z1;
	const int* pZ2 = &z2;

	std::cout << "pZ1: " << typeid(pZ1).name( ) << std::endl;
	std::cout << "pZ2: " << typeid(pZ2).name( ) << std::endl;
	
	int data1 = 0;
	int* const w1 = &data1;
    int data2 = 0;
	const int* w2 = &data2;
	std::cout << "w1: " << typeid(w1).name( ) << std::endl;
	std::cout << "*w1: " << typeid(*w1).name( ) << std::endl;
	std::cout << "w2: " << typeid(w2).name( ) << std::endl;
	std::cout << "*w2: " << typeid(*w2).name( ) << std::endl;
	
	T* a;
//	T b; //error
	
	return 0;
}