#include <memory>
template<
class T,
class Deleter = std::default_delete<T>
> class transitive_ptr : public std::unique_ptr<T,Deleter>
{
public:
// inherit typedefs for the sake of completeness
typedef
typename std::unique_ptr<T,Deleter>::pointer
pointer;
typedef
typename std::unique_ptr<T,Deleter>::element_type
element_type;
typedef
typename std::unique_ptr<T,Deleter>::deleter_type
deleter_type;
// extra typedef
typedef
const typename std::remove_pointer<pointer>::type*
const_pointer;
// inherit constructor
using std::unique_ptr<T,Deleter>::unique_ptr;
// add transitively const version of get()
pointer get() {
return std::unique_ptr<T,Deleter>::get();
}
const_pointer get() const {
return std::unique_ptr<T,Deleter>::get();
}
// add transitively const version of operator*()
typename std::add_lvalue_reference<T>::type
operator*() {
return *get();
}
typename std::add_lvalue_reference<const T>::type
operator*() const {
return *get();
}
// add transitively const version of operator->()
pointer operator->() {
return get();
}
const_pointer operator->() const {
return get();
}
};
struct A {
transitive_ptr<int> x;
A(): x{new int} {}
};
int main() {
const A a;
*a.x = 3;
}
I2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlPAogICAgY2xhc3MgVCwKICAgIGNsYXNzIERlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPFQ+Cj4gY2xhc3MgdHJhbnNpdGl2ZV9wdHIgOiBwdWJsaWMgc3RkOjp1bmlxdWVfcHRyPFQsRGVsZXRlcj4KewpwdWJsaWM6CiAgICAvLyBpbmhlcml0IHR5cGVkZWZzIGZvciB0aGUgc2FrZSBvZiBjb21wbGV0ZW5lc3MKICAgIHR5cGVkZWYKICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuaXF1ZV9wdHI8VCxEZWxldGVyPjo6cG9pbnRlcgogICAgICAgIHBvaW50ZXI7CiAgICB0eXBlZGVmCiAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmlxdWVfcHRyPFQsRGVsZXRlcj46OmVsZW1lbnRfdHlwZQogICAgICAgIGVsZW1lbnRfdHlwZTsKICAgIHR5cGVkZWYKICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuaXF1ZV9wdHI8VCxEZWxldGVyPjo6ZGVsZXRlcl90eXBlCiAgICAgICAgZGVsZXRlcl90eXBlOwogICAgCiAgICAvLyBleHRyYSB0eXBlZGVmCiAgICB0eXBlZGVmCiAgICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxwb2ludGVyPjo6dHlwZSoKICAgICAgICBjb25zdF9wb2ludGVyOwogCiAgICAvLyBpbmhlcml0IGNvbnN0cnVjdG9yCiAgICB1c2luZyBzdGQ6OnVuaXF1ZV9wdHI8VCxEZWxldGVyPjo6dW5pcXVlX3B0cjsKICAKICAgIC8vIGFkZCB0cmFuc2l0aXZlbHkgY29uc3QgdmVyc2lvbiBvZiBnZXQoKQogICAgcG9pbnRlciBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxULERlbGV0ZXI+OjpnZXQoKTsKICAgIH0KICAgIGNvbnN0X3BvaW50ZXIgZ2V0KCkgY29uc3QgewogICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCxEZWxldGVyPjo6Z2V0KCk7CiAgICB9CiAKICAgIC8vIGFkZCB0cmFuc2l0aXZlbHkgY29uc3QgdmVyc2lvbiBvZiBvcGVyYXRvciooKQogICAgdHlwZW5hbWUgc3RkOjphZGRfbHZhbHVlX3JlZmVyZW5jZTxUPjo6dHlwZQogICAgb3BlcmF0b3IqKCkgewogICAgICAgIHJldHVybiAqZ2V0KCk7CiAgICB9CiAgICB0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPGNvbnN0IFQ+Ojp0eXBlCiAgICBvcGVyYXRvciooKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICpnZXQoKTsKICAgIH0KICAKICAgIC8vIGFkZCB0cmFuc2l0aXZlbHkgY29uc3QgdmVyc2lvbiBvZiBvcGVyYXRvci0+KCkKICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIHsKICAgICAgICByZXR1cm4gZ2V0KCk7CiAgICB9CiAgICBjb25zdF9wb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGdldCgpOwogICAgfQp9OwoKc3RydWN0IEEgewogICAgdHJhbnNpdGl2ZV9wdHI8aW50PiB4OwogICAgQSgpOiB4e25ldyBpbnR9IHt9Cn07CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IEEgYTsKICAgICphLnggPSAzOwp9
prog.cpp: In function ‘int main()’:
prog.cpp:62:10: error: assignment of read-only location ‘a.A::x.transitive_ptr<T, Deleter>::operator*<int, std::default_delete<int> >()’
*a.x = 3;
^