1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <iostream> #include <typeinfo> template<class T> struct addr_impl_ref { T & v_; inline addr_impl_ref( T & v ): v_( v ) {} inline operator T& () const { return v_; } private: addr_impl_ref & operator=(const addr_impl_ref &); }; template<class T> struct addressof_impl { static inline T * f( T & v, long ) { std::cout << "reference - " << typeid(T).name() << " - "; return reinterpret_cast<T*>( &const_cast<char&>(reinterpret_cast<const volatile char &>(v))); } static inline T * f( T * v, int ) { std::cout << "pointer - " << typeid(T).name() << " - "; return v; } }; template<class T> T * addressof( T & v ) { T* t = addressof_impl<T>::f( addr_impl_ref<T>( v ), 0 ); std::cout << t << "\n"; return t; } struct pointer { int* i; operator int*() const { return i; } operator int&() const { return *i; } }; void func(); typedef void (*func_ptr)(); struct convertible_ptr { operator func_ptr() { return func; } }; typedef void (&func_ref)(); struct convertible_ref { operator func_ref() { return func; } }; int main() { int i; int* p; int** pp; int a[5]; addressof(i); addressof(p); addressof(pp); addressof(a); pointer P; addressof(P); addressof(func); //addressof(&func); // does not compile convertible_ptr cp; addressof(cp); convertible_ref cr; addressof(cr); } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgYWRkcl9pbXBsX3JlZgp7CiAgVCAmIHZfOwoKICBpbmxpbmUgYWRkcl9pbXBsX3JlZiggVCAmIHYgKTogdl8oIHYgKSB7fQogIGlubGluZSBvcGVyYXRvciBUJiAoKSBjb25zdCB7IHJldHVybiB2XzsgfQoKcHJpdmF0ZToKICBhZGRyX2ltcGxfcmVmICYgb3BlcmF0b3I9KGNvbnN0IGFkZHJfaW1wbF9yZWYgJik7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgYWRkcmVzc29mX2ltcGwKewogIHN0YXRpYyBpbmxpbmUgVCAqIGYoIFQgJiB2LCBsb25nICkgewogICAgc3RkOjpjb3V0IDw8ICJyZWZlcmVuY2UgLSAiIDw8IHR5cGVpZChUKS5uYW1lKCkgPDwgIiAtICI7CiAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oCiAgICAgICAgJmNvbnN0X2Nhc3Q8Y2hhciY+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9sYXRpbGUgY2hhciAmPih2KSkpOwogIH0KCiAgc3RhdGljIGlubGluZSBUICogZiggVCAqIHYsIGludCApIHsKICAgIHN0ZDo6Y291dCA8PCAicG9pbnRlciAtICIgPDwgdHlwZWlkKFQpLm5hbWUoKSA8PCAiIC0gIjsKICAgIHJldHVybiB2OwogIH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+ClQgKiBhZGRyZXNzb2YoIFQgJiB2ICkgewogIFQqIHQgPSBhZGRyZXNzb2ZfaW1wbDxUPjo6ZiggYWRkcl9pbXBsX3JlZjxUPiggdiApLCAwICk7CiAgc3RkOjpjb3V0IDw8IHQgPDwgIlxuIjsKICByZXR1cm4gdDsKfQoKCnN0cnVjdCBwb2ludGVyIHsKICBpbnQqIGk7CiAgb3BlcmF0b3IgaW50KigpIGNvbnN0IHsgcmV0dXJuIGk7IH0KICBvcGVyYXRvciBpbnQmKCkgY29uc3QgeyByZXR1cm4gKmk7IH0KfTsKCnZvaWQgZnVuYygpOwoKdHlwZWRlZiB2b2lkICgqZnVuY19wdHIpKCk7CgpzdHJ1Y3QgY29udmVydGlibGVfcHRyIHsKICBvcGVyYXRvciBmdW5jX3B0cigpIHsgcmV0dXJuIGZ1bmM7IH0KfTsKCnR5cGVkZWYgdm9pZCAoJmZ1bmNfcmVmKSgpOwoKc3RydWN0IGNvbnZlcnRpYmxlX3JlZiB7CiAgb3BlcmF0b3IgZnVuY19yZWYoKSB7IHJldHVybiBmdW5jOyB9Cn07CgppbnQgbWFpbigpIHsKICBpbnQgaTsgaW50KiBwOyBpbnQqKiBwcDsgaW50IGFbNV07CiAgYWRkcmVzc29mKGkpOwogIGFkZHJlc3NvZihwKTsKICBhZGRyZXNzb2YocHApOwogIGFkZHJlc3NvZihhKTsKCiAgcG9pbnRlciBQOwogIGFkZHJlc3NvZihQKTsKCiAgYWRkcmVzc29mKGZ1bmMpOwogIC8vYWRkcmVzc29mKCZmdW5jKTsgLy8gZG9lcyBub3QgY29tcGlsZQoKICBjb252ZXJ0aWJsZV9wdHIgY3A7CiAgYWRkcmVzc29mKGNwKTsKCiAgY29udmVydGlibGVfcmVmIGNyOwogIGFkZHJlc3NvZihjcik7Cn0=
-
upload with new input
-
result: Success time: 0s memory: 2728 kB returned value: 0
reference - i - 0xbfa5437c reference - Pi - 0xbfa54378 reference - PPi - 0xbfa54374 reference - A5_i - 0xbfa5435c reference - 7pointer - 0xbfa54370 pointer - FvvE - 1 reference - 15convertible_ptr - 0xbfa54383 reference - 15convertible_ref - 0xbfa54382


