Skip to content

Commit f31f673

Browse files
committed
Fix for downcast to parent.
1 parent 454bd3c commit f31f673

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

include/cpp2util.h

+16-4
Original file line numberDiff line numberDiff line change
@@ -979,9 +979,15 @@ auto as( X const& x ) -> decltype(auto) {
979979
return x;
980980
}
981981

982+
template< typename C, typename X >
983+
requires std::is_same_v<C, X>
984+
auto as( X& x ) -> decltype(auto) {
985+
return x;
986+
}
987+
982988
template< typename C, typename X >
983989
auto as( X const& x ) -> auto
984-
requires (!std::is_same_v<C, X> && requires { C{x}; })
990+
requires (!std::is_same_v<C, X> && !std::is_base_of_v<C, X> && requires { C{x}; })
985991
{
986992
// Experiment: Recognize the nested `::value_type` pattern for some dynamic library types
987993
// like std::optional, and try to prevent accidental narrowing conversions even when
@@ -995,9 +1001,15 @@ auto as( X const& x ) -> auto
9951001
}
9961002

9971003
template< typename C, typename X >
998-
requires std::is_base_of_v<C, X>
999-
auto as( X&& x ) -> C&& {
1000-
return CPP2_FORWARD(x);
1004+
requires (std::is_base_of_v<C, X> && !std::is_same_v<C, X>)
1005+
auto as( X& x ) -> C& {
1006+
return x;
1007+
}
1008+
1009+
template< typename C, typename X >
1010+
requires (std::is_base_of_v<C, X> && !std::is_same_v<C, X>)
1011+
auto as( X const& x ) -> C const& {
1012+
return x;
10011013
}
10021014

10031015
template< typename C, typename X >

0 commit comments

Comments
 (0)