Index: include/deque
===================================================================
--- include/deque	(revision 596338)
+++ include/deque	(working copy)
@@ -180,7 +180,7 @@
         return *_C_cur;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
     
     reference operator[] (difference_type __n) const {
         return *(*this + __n);
Index: include/deque_spec.h
===================================================================
--- include/deque_spec.h	(revision 596338)
+++ include/deque_spec.h	(working copy)
@@ -127,7 +127,7 @@
 #ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
 
         __iterator_base::pointer operator-> () const {
-            return __iterator_base::pointer (&*__imp);
+            return _RWSTD_ADDRESS_OF (__iterator_base::pointer, *__imp);
         }
 
 #endif   // _RWSTD_NO_NONCLASS_ARROW_RETURN
@@ -231,7 +231,7 @@
 #ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
 
         const_pointer operator-> () const {
-            return const_pointer (&*__imp);
+            return _RWSTD_ADDRESS_OF (const_pointer, *__imp);
         }
 
 #endif   //  _RWSTD_NO_NONCLASS_ARROW_RETURN
Index: include/list
===================================================================
--- include/list	(revision 596338)
+++ include/list	(working copy)
@@ -129,7 +129,7 @@
         return (*_C_node)._C_data;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
     
     difference_type operator- (const __rw_list_iter&) const {
         return 0;
Index: include/list_spec.h
===================================================================
--- include/list_spec.h	(revision 596338)
+++ include/list_spec.h	(working copy)
@@ -127,7 +127,7 @@
 #ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
 
         __iterator_base::pointer operator-> () const {
-            return __iterator_base::pointer (&*__imp);
+            return _RWSTD_ADDRESS_OF (__iterator_base::pointer, *__imp);
         }
 
 #endif   // _RWSTD_NO_NONCLASS_ARROW_RETURN
@@ -191,7 +191,7 @@
 #ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
 
         const_pointer operator-> () const {
-            return const_pointer (&*__imp);
+            return _RWSTD_ADDRESS_OF (const_pointer, *__imp);
         }
 
 #endif   //  _RWSTD_NO_NONCLASS_ARROW_RETURN
Index: include/rw/_defs.h
===================================================================
--- include/rw/_defs.h	(revision 596338)
+++ include/rw/_defs.h	(working copy)
@@ -983,12 +983,16 @@
 #endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
 
 
+#define _RWSTD_ADDRESS_OF(type, arg)   ((type)(&(char&)(arg)))
+
+
 #ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
    // expected signature: "_TypeT* operator->()"
    // and/or:             "const _TypeT* operator->() const"
-#  define _RWSTD_OPERATOR_ARROW(signature) signature { return &**this; }
+#  define _RWSTD_OPERATOR_ARROW(type, signature) \
+    type signature { return _RWSTD_ADDRESS_OF (type, **this); }
 #else
-#  define _RWSTD_OPERATOR_ARROW(ignore)
+#  define _RWSTD_OPERATOR_ARROW(ignore0, ignore1)
 #endif   // _RWSTD_NO_NONCLASS_ARROW_RETURN
 
 
Index: include/rw/_iterator.h
===================================================================
--- include/rw/_iterator.h	(revision 596338)
+++ include/rw/_iterator.h	(working copy)
@@ -149,7 +149,7 @@
     }
 
     // 24.4.1.3.4, p1
-    _RWSTD_OPERATOR_ARROW (pointer operator->() const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator->() const);
 
     // 24.4.1.3.5, p1
     reverse_iterator& operator++ () {
@@ -341,7 +341,7 @@
         return *--__tmp;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator->() const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator->() const);
 
     __reverse_bi_iterator& operator++ () {
         return --current, *this;
Index: include/rw/_iterbase.h
===================================================================
--- include/rw/_iterbase.h	(revision 596338)
+++ include/rw/_iterbase.h	(working copy)
@@ -443,7 +443,7 @@
         return _C_iter [__n];
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 
     __rw_debug_iter& operator++ () {
         _RWSTD_ASSERT (!_C_is_end ());
Index: include/rw/_specialized.h
===================================================================
--- include/rw/_specialized.h	(revision 596338)
+++ include/rw/_specialized.h	(working copy)
@@ -139,6 +142,13 @@
 #endif   // _RWSTD_NO_PTR_VALUE_TEMPLATE_OVERLOAD
 
 
+template <class _Type_T>
+inline _Type_T* __rw_address_of (_Type_T& __ref)
+{
+    return _RWSTD_ADDRESS_OF (_Type_T*, __ref);
+}
+
+
 }   // namespace __rw
 
 
@@ -158,7 +168,7 @@
 
     _TRY {
         for (; __first != __last; ++__first, ++__res)
-            _RW::__rw_construct (&*__res, *__first);
+            _RW::__rw_construct (_RW::__rw_address_of (*__res), *__first);
     }
     _CATCH (...) {
         _RW::__rw_destroy (__start, __res);
@@ -208,7 +218,7 @@
 
     _TRY {
         for (; __first != __last; ++__first)
-            _RW::__rw_construct (&*__first, __x);
+            _RW::__rw_construct (_RW::__rw_address_of (*__first), __x);
     }
     _CATCH (...) {
         _RW::__rw_destroy (__start, __first);
Index: include/rw/_streamiter.h
===================================================================
--- include/rw/_streamiter.h	(revision 596338)
+++ include/rw/_streamiter.h	(working copy)
@@ -96,7 +96,7 @@
     }
 
     // 24.5.1.2, p2
-    _RWSTD_OPERATOR_ARROW (const value_type* operator->() const);
+    _RWSTD_OPERATOR_ARROW (const value_type*, operator->() const);
 
     // 24.5.1.2, p3
     istream_iterator& operator++ () {
Index: include/rw/_tree.h
===================================================================
--- include/rw/_tree.h	(revision 596338)
+++ include/rw/_tree.h	(working copy)
@@ -220,7 +220,7 @@
         return _C_node->_C_value;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 };
 
 
Index: include/tr1/_smartptr.h
===================================================================
--- include/tr1/_smartptr.h	(revision 596338)
+++ include/tr1/_smartptr.h	(working copy)
@@ -321,7 +321,7 @@
     }
 
     element_type* operator->() const {
-        return &**this;
+        return _C_ptr;
     }
 
     long use_count () const {
Index: tests/include/alg_test.h
===================================================================
--- tests/include/alg_test.h	(revision 596338)
+++ tests/include/alg_test.h	(working copy)
@@ -434,7 +434,7 @@
         return *cur_;
     }
 
-    _RWSTD_OPERATOR_ARROW (const value_type* operator-> () const);
+    _RWSTD_OPERATOR_ARROW (const value_type*, operator-> () const);
 
     InputIter& operator++ () {
         RW_ASSERT (*this == *this);      // assert *this is valid
@@ -623,7 +623,7 @@
         return Proxy (ptr_);
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 
     OutputIter& operator++ () {
         RW_ASSERT (cur_ == ptr_->cur_);
@@ -725,7 +725,7 @@
         return *cur_;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 
     FwdIter& operator++ () {
         RW_ASSERT (cur_ != 0 && cur_ != end_);
@@ -760,7 +760,7 @@
         return Base::operator* ();
     }
 
-    _RWSTD_OPERATOR_ARROW (const value_type* operator-> () const);
+    _RWSTD_OPERATOR_ARROW (const value_type*, operator-> () const);
 };
 
 /**************************************************************************/
@@ -809,7 +809,7 @@
         return *cur_;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 
     BidirIter& operator++ () {
         RW_ASSERT (cur_ != 0 && cur_ != end_);
@@ -855,7 +855,7 @@
         return Base::operator* ();
     }
 
-    _RWSTD_OPERATOR_ARROW (const value_type* operator-> () const);
+    _RWSTD_OPERATOR_ARROW (const value_type*, operator-> () const);
 };
 
 /**************************************************************************/
@@ -897,7 +897,7 @@
         return *cur_;
     }
 
-    _RWSTD_OPERATOR_ARROW (pointer operator-> () const);
+    _RWSTD_OPERATOR_ARROW (pointer, operator-> () const);
 
     RandomAccessIter& operator++ () {
         RW_ASSERT (cur_ != 0 && cur_ != end_);
@@ -1001,7 +1001,7 @@
         return Base::operator* ();
     }
 
-    _RWSTD_OPERATOR_ARROW (const value_type* operator-> () const);
+    _RWSTD_OPERATOR_ARROW (const value_type*, operator-> () const);
 
     const value_type& operator[] (difference_type inx) const {
         return Base::operator[] (inx);
