@@ -308,7 +308,7 @@ constexpr auto contract_group::set_handler(handler h) -> handler {
308
308
309
309
// Null pointer deref checking
310
310
//
311
- auto assert_not_null (auto && p CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> auto&&
311
+ auto assert_not_null (auto && p CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> decltype( auto )
312
312
{
313
313
// NOTE: This "!= T{}" test may or may not work for STL iterators. The standard
314
314
// doesn't guarantee that using == and != will reliably report whether an
@@ -319,15 +319,15 @@ auto assert_not_null(auto&& p CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> auto&&
319
319
320
320
// Subscript bounds checking
321
321
//
322
- auto assert_in_bounds (auto && x, auto && arg CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> auto&&
322
+ auto assert_in_bounds (auto && x, auto && arg CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> decltype( auto )
323
323
requires (std::is_integral_v<CPP2_TYPEOF(arg)> &&
324
324
requires { std::ssize (x); x[arg]; })
325
325
{
326
326
Bounds.expects (0 <= arg && arg < std::ssize (x), " out of bounds access attempt detected" CPP2_SOURCE_LOCATION_ARG);
327
327
return std::forward<decltype (x)>(x) [ std::forward<decltype (arg)>(arg) ];
328
328
}
329
329
330
- auto assert_in_bounds (auto && x, auto && arg CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> auto&&
330
+ auto assert_in_bounds (auto && x, auto && arg CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> decltype( auto )
331
331
requires (!(std::is_integral_v<CPP2_TYPEOF(arg)> &&
332
332
requires { std::ssize (x); x[arg]; }))
333
333
{
@@ -652,7 +652,7 @@ auto as(auto const&) -> auto {
652
652
653
653
template < typename C, typename X >
654
654
requires std::is_same_v<C, X>
655
- auto as ( X const & x ) -> auto&& {
655
+ auto as ( X const & x ) -> decltype( auto ) {
656
656
return x;
657
657
}
658
658
@@ -769,7 +769,7 @@ constexpr auto is( std::variant<Ts...> const& x, auto const& value ) -> bool
769
769
// as
770
770
//
771
771
template <size_t I, typename ... Ts>
772
- constexpr auto operator_as ( std::variant<Ts...> const & x ) -> auto&& {
772
+ constexpr auto operator_as ( std::variant<Ts...> const & x ) -> decltype( auto ) {
773
773
if constexpr (I < std::variant_size_v<std::variant<Ts...>>) {
774
774
return std::get<I>( x );
775
775
}
@@ -926,7 +926,7 @@ constexpr auto is( std::optional<T> const& x, auto const& value ) -> bool
926
926
//
927
927
template <typename T, typename X>
928
928
requires std::is_same_v<X,std::optional<T>>
929
- constexpr auto as ( X const & x ) -> auto&&
929
+ constexpr auto as ( X const & x ) -> decltype( auto )
930
930
{ return x.value (); }
931
931
932
932
0 commit comments