te icon indicating copy to clipboard operation
te copied to clipboard

Unable to return a const reference on the interface

Open suy opened this issue 1 year ago • 0 comments

I expected to be able to return a const reference to a non-copyable object, like std::type_info:

struct Introspectable : te::poly<Introspectable> {
    const std::type_info& type() const {
        return te::call<const std::type_info&>([](auto const& self) {
            return typeid(self);
        }, *this);
    }
};

But I got this compilation errors:

Compile error (GCC 9.4):

In file included from main.cpp:4:
te.hpp: In instantiation of ‘constexpr auto boost::ext::te::v1::detail::call_impl(const boost::ext::te::v1::detail::poly_base&, std::integral_constant<long unsigned int, _Nm>, boost::ext::te::v1::detail::type_list<R>, TExpr, Ts&& ...) [with I = boost_te::Introspectable; long unsigned int N = 1; R = const std::type_info&; TExpr = boost_te::Introspectable::type() const::<lambda(const auto:3&)>; Ts = {}]’:
te.hpp:554:30:   required from ‘constexpr auto boost::ext::te::v1::call(TExpr, const I&, Ts&& ...) [with R = const std::type_info&; long unsigned int N = 0; TExpr = boost_te::Introspectable::type() const::<lambda(const auto:3&)>; I = boost_te::Introspectable; Ts = {}]’
main.cpp:18:17:   required from here
te.hpp:522:44: error: ‘std::type_info::type_info(const std::type_info&)’ is private within this context
  522 |       self.ptr(), std::forward<Ts>(args)...);
      |                                            ^
In file included from /usr/include/c++/9/bits/exception_ptr.h:39,
                 from /usr/include/c++/9/exception:143,
                 from /usr/include/c++/9/ios:39,
                 from /usr/include/c++/9/ostream:38,
                 from /usr/include/c++/9/iostream:39,
                 from main.cpp:1:
/usr/include/c++/9/typeinfo:178:5: note: declared private here
  178 |     type_info(const type_info&);
      |     ^~~~~~~~~
main.cpp: In member function ‘const std::type_info& boost_te::Introspectable::type() const’:
main.cpp:16:47: warning: returning reference to temporary [-Wreturn-local-addr]
   16 |         return te::call<const std::type_info&>([](auto const& self) {
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
   17 |             return typeid(self);
      |             ~~~~~~~~~~~~~~~~~~~~               
   18 |         }, *this);
      |         ~~~~~~~~~                              

Possibly related: #13

Thank you!

Compile error (clang 14):

In file included from main.cpp:4:
./te.hpp:521:10: error: calling a private constructor of class 'std::type_info'
  return reinterpret_cast<R (*)(void *, Ts...)>(self.vptr[N - 1])(
         ^
./te.hpp:554:18: note: in instantiation of function template specialization 'boost::te::detail::call_impl<boost_te::Introspectable, 1, const std::type_info &, (lambda at main.cpp:16:48)>' requested here
  return detail::call_impl<I>(
                 ^
main.cpp:16:20: note: in instantiation of function template specialization 'boost::te::call<const std::type_info &, 0, (lambda at main.cpp:16:48), boost_te::Introspectable>' requested here
        return te::call<const std::type_info&>([](auto const& self) {
                   ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/typeinfo:181:5: note: declared private here
    type_info(const type_info&);
    ^
main.cpp:16:16: warning: returning reference to local temporary object [-Wreturn-stack-address]
        return te::call<const std::type_info&>([](auto const& self) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 1 error generated.
  • Version: latest te.hpp (27465847fe489d33a91014488284210f183cb502)
  • Platform: Linux, GCC or clang
  • Subsystem: (?)

suy avatar Oct 26 '22 13:10 suy