diff --git a/addressof_test.cpp b/addressof_test.cpp
new file mode 100644
index 0000000..62d988c
--- /dev/null
+++ b/addressof_test.cpp
@@ -0,0 +1,46 @@
+// Copyright (C) 2002 Brad King (brad.king@kitware.com)
+// Doug Gregor (gregod@cs.rpi.edu)
+//
+// Permission to copy, use, sell and distribute this software is granted
+// provided this copyright notice appears in all copies.
+// Permission to modify the code and to distribute modified code is granted
+// provided this copyright notice appears in all copies, and a notice
+// that the code was modified is included with the copyright notice.
+//
+// This software is provided "as is" without express or implied warranty,
+// and with no claim as to its suitability for any purpose.
+
+// For more information, see http://www.boost.org
+
+#define BOOST_INCLUDE_MAIN
+#include
+#include
+
+struct useless_type {};
+
+class nonaddressable {
+public:
+ void dummy(); // Silence GCC warning: all member of class are private
+
+private:
+ useless_type operator&() const;
+};
+
+int test_main(int, char*[])
+{
+ nonaddressable* px = new nonaddressable();
+
+ nonaddressable& x = *px;
+ BOOST_TEST(boost::addressof(x) == px);
+
+ const nonaddressable& cx = *px;
+ BOOST_TEST(boost::addressof(cx) == static_cast(px));
+
+ volatile nonaddressable& vx = *px;
+ BOOST_TEST(boost::addressof(vx) == static_cast(px));
+
+ const volatile nonaddressable& cvx = *px;
+ BOOST_TEST(boost::addressof(cvx) == static_cast(px));
+
+ return 0;
+}
diff --git a/include/boost/utility.hpp b/include/boost/utility.hpp
index 0f0d787..a6c9464 100644
--- a/include/boost/utility.hpp
+++ b/include/boost/utility.hpp
@@ -17,6 +17,7 @@
#include
#include
+#include
namespace boost
{
diff --git a/include/boost/utility/addressof.hpp b/include/boost/utility/addressof.hpp
new file mode 100644
index 0000000..ee997ff
--- /dev/null
+++ b/include/boost/utility/addressof.hpp
@@ -0,0 +1,53 @@
+// Copyright (C) 2002 Brad King (brad.king@kitware.com)
+// Doug Gregor (gregod@cs.rpi.edu)
+//
+// Permission to copy, use, sell and distribute this software is granted
+// provided this copyright notice appears in all copies.
+// Permission to modify the code and to distribute modified code is granted
+// provided this copyright notice appears in all copies, and a notice
+// that the code was modified is included with the copyright notice.
+//
+// This software is provided "as is" without express or implied warranty,
+// and with no claim as to its suitability for any purpose.
+
+// For more information, see http://www.boost.org
+
+#ifndef BOOST_UTILITY_ADDRESSOF_HPP
+#define BOOST_UTILITY_ADDRESSOF_HPP
+
+namespace boost {
+
+template
+inline T* addressof(T& v)
+{
+ struct addressof_helper {};
+ return reinterpret_cast(&reinterpret_cast(v));
+}
+
+template
+inline const T* addressof(const T& v)
+{
+ struct addressof_helper {};
+ return reinterpret_cast(
+ &reinterpret_cast(v));
+}
+
+template
+inline volatile T* addressof(volatile T& v)
+{
+ struct addressof_helper {};
+ return reinterpret_cast(
+ &reinterpret_cast(v));
+}
+
+template
+inline const volatile T* addressof(const volatile T& v)
+{
+ struct addressof_helper {};
+ return reinterpret_cast(
+ &reinterpret_cast(v));
+}
+
+}
+
+#endif // BOOST_UTILITY_ADDRESSOF_HPP
diff --git a/utility.htm b/utility.htm
index 45bcd1f..9a24679 100644
--- a/utility.htm
+++ b/utility.htm
@@ -22,6 +22,7 @@
checked_array_delete()
Function templates next() and prior()
Class noncopyable
+ Function template addressof()
Function template tie() and supporting class tied.
Function templates checked_delete() and
@@ -133,6 +134,48 @@ emphasize that it is to be used only as a base class. Dave Abrahams notes
concern about the effect on compiler optimization of adding (even trivial inline)
destructor declarations. He says "Probably this concern is misplaced, because
noncopyable will be used mostly for classes which own resources and thus have non-trivial destruction semantics."
+
+Function addressof() returns the address of an object.
+
+
+
+template <typename T> inline T* addressof(T& v);
+template <typename T> inline const T* addressof(const T& v);
+template <typename T> inline volatile T* addressof(volatile T& v);
+template <typename T> inline const volatile T* addressof(const volatile T& v);
+
+
+
+
+C++ allows programmers to replace the unary
+operator&() class member used to get the address of
+an object. Getting the real address of an object requires ugly
+casting tricks to avoid invoking the overloaded
+operator&(). Function addressof()
+provides a wrapper around the necessary code to make it easy to get an
+object's real address.
+
+
+The program addressof_test.cpp can be
+used to verify that addressof() works as expected.
+
+Contributed by Brad King based on ideas from discussion with Doug Gregor.
+Example
+
+#include <boost/utility.hpp>
+
+struct useless_type {};
+class nonaddressable {
+ useless_type operator&() const;
+};
+
+void f() {
+ nonaddressable x;
+ nonaddressable* xp = boost::addressof(x);
+ // nonaddressable* xpe = &x; /* error */
+}
+
+
Class templates for the Base-from-Member Idiom
See separate documentation.
Function template tie()