#include <iostream>
#include <type_traits>
void foo(void* p) { std::cout << "foo() called. it better not try to modify *p!\n"; }
template<typename T>
void Remove (T *p)
{
foo( const_cast< typename std::remove_const<T>::type *> (p) );
}
int main()
{
const int *p;
Remove(p);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp2b2lkIGZvbyh2b2lkKiBwKSB7IHN0ZDo6Y291dCA8PCAiZm9vKCkgY2FsbGVkLiBpdCBiZXR0ZXIgbm90IHRyeSB0byBtb2RpZnkgKnAhXG4iOyB9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIFJlbW92ZSAoVCAqcCkKewogICAgZm9vKCBjb25zdF9jYXN0PCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUPjo6dHlwZSAqPiAocCkgKTsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBpbnQgKnA7CiAgICBSZW1vdmUocCk7Cn0K