diff --git a/doc/27_ref_optional_synopsis.qbk b/doc/27_ref_optional_synopsis.qbk
index 6a4f853..54523d6 100644
--- a/doc/27_ref_optional_synopsis.qbk
+++ b/doc/27_ref_optional_synopsis.qbk
@@ -79,6 +79,7 @@
typedef T value_type ;
typedef T & reference_type ;
typedef T const& reference_const_type ;
+ typedef T && rval_reference_type ;
typedef T * pointer_type ;
typedef T const* pointer_const_type ;
@@ -182,6 +183,7 @@
typedef T& value_type;
typedef T& reference_type;
typedef T& reference_const_type; // no const propagation
+ typedef T& rval_reference_type;
typedef T* pointer_type;
typedef T* pointer_const_type; // no const propagation
diff --git a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html
index c3325c5..3ce9d0a 100644
--- a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html
+++ b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html
@@ -35,6 +35,7 @@
typedef T& value_type;
typedef T& reference_type;
typedef T& reference_const_type;
+ typedef T& rval_reference_type;
typedef T* pointer_type;
typedef T* pointer_const_type;
diff --git a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html
index 2877563..56d02de 100644
--- a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html
+++ b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html
@@ -35,6 +35,7 @@
typedef T value_type ;
typedef T & reference_type ;
typedef T const& reference_const_type ;
+ typedef T && rval_reference_type ;
typedef T * pointer_type ;
typedef T const* pointer_const_type ;
diff --git a/doc/html/index.html b/doc/html/index.html
index b61f7b4..0addd4c 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -144,7 +144,7 @@
-Last revised: March 05, 2016 at 22:52:00 GMT |
+Last revised: March 06, 2016 at 18:03:49 GMT |
|
diff --git a/include/boost/optional/detail/optional_reference_spec.hpp b/include/boost/optional/detail/optional_reference_spec.hpp
index eeabade..ba3951a 100644
--- a/include/boost/optional/detail/optional_reference_spec.hpp
+++ b/include/boost/optional/detail/optional_reference_spec.hpp
@@ -86,6 +86,7 @@ public:
typedef T& value_type;
typedef T& reference_type;
typedef T& reference_const_type;
+ typedef T& rval_reference_type;
typedef T* pointer_type;
typedef T* pointer_const_type;
diff --git a/test/Jamfile.v2 b/test/Jamfile.v2
index 20be6cf..7394ce8 100644
--- a/test/Jamfile.v2
+++ b/test/Jamfile.v2
@@ -30,6 +30,7 @@ import testing ;
[ run optional_test_ref_convert_assign_const_int.cpp ]
[ run optional_test_ref_portable_minimum.cpp ]
[ run optional_test_ref_move.cpp ]
+ [ run optional_test_ref_to_val.cpp ]
[ run optional_test_inplace_factory.cpp ]
[ run optional_test_io.cpp ]
[ run optional_test_move.cpp ]
diff --git a/test/optional_test_ref_to_val.cpp b/test/optional_test_ref_to_val.cpp
new file mode 100644
index 0000000..19e1675
--- /dev/null
+++ b/test/optional_test_ref_to_val.cpp
@@ -0,0 +1,116 @@
+// Copyright (C) 2016 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+
+using boost::optional;
+using boost::none;
+
+struct Value
+{
+ int val;
+ explicit Value(int v) : val(v) {}
+};
+
+int val(int const& i)
+{
+ return i;
+}
+
+int val(Value const& v)
+{
+ return v.val;
+}
+
+template
+optional make_opt_ref(Tref& v)
+{
+ return optional(v);
+}
+
+template
+void test_construct_from_optional_ref()
+{
+ Tref v1 (1), v2 (2);
+
+ optional opt_ref0;
+ optional opt_ref1 (v1);
+
+ optional opt_val0 (opt_ref0);
+ optional opt_val1 (opt_ref1);
+ optional opt_val2 (make_opt_ref(v2));
+
+ BOOST_TEST (!opt_val0);
+ BOOST_TEST (opt_val1);
+ BOOST_TEST (opt_val2);
+
+ BOOST_TEST_EQ (1, val(*opt_val1));
+ BOOST_TEST_EQ (2, val(*opt_val2));
+
+ BOOST_TEST (boost::addressof(*opt_val1) != boost::addressof(v1));
+ BOOST_TEST (boost::addressof(*opt_val2) != boost::addressof(v2));
+}
+
+template
+void test_assign_from_optional_ref()
+{
+ Tref v1 (1), v2 (2);
+
+ optional opt_ref0;
+ optional opt_ref1 (v1);
+
+ optional opt_val0;
+ optional opt_val1;
+ optional opt_val2;
+
+ opt_val0 = opt_ref0;
+ opt_val1 = opt_ref1;
+ opt_val2 = make_opt_ref(v2);
+
+ BOOST_TEST (!opt_val0);
+ BOOST_TEST (opt_val1);
+ BOOST_TEST (opt_val2);
+
+ BOOST_TEST_EQ (1, val(*opt_val1));
+ BOOST_TEST_EQ (2, val(*opt_val2));
+
+ BOOST_TEST (boost::addressof(*opt_val1) != boost::addressof(v1));
+ BOOST_TEST (boost::addressof(*opt_val2) != boost::addressof(v2));
+}
+
+
+int main()
+{
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+ test_construct_from_optional_ref();
+
+ test_assign_from_optional_ref();
+ test_assign_from_optional_ref();
+
+ test_assign_from_optional_ref();
+ test_assign_from_optional_ref();
+
+ return boost::report_errors();
+}