Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::any of std::unique_ptr doesn't work?

Tags:

c++

c++20

Please consider the following C++20 program:

#include <any>
#include <memory>

int main() {
  std::any a;
  std::unique_ptr<int> x = std::make_unique<int>(42);
  a.emplace<std::unique_ptr<int>>(std::move(x));
}

I'm getting:

test.cc: In function ‘int main()’:
test.cc:7:47: error: no matching function for call to ‘std::any::emplace<std::unique_ptr<int, std::default_delete<int> > >(std::remove_reference<std::unique_ptr<int>&>::type)’
    7 |   a.emplace<std::unique_ptr<int>>(std::move(x));
      |                                               ^
In file included from test.cc:1:
/usr/include/c++/9/any:273:7: note: candidate: ‘template<class _ValueType, class ... _Args> typename std::any::__any_constructible<std::any::_Decay<_ValueType>&, std::any::_Decay<_ValueType>, _Args&& ...>::type std::any::emplace(_Args&& ...)’
  273 |       emplace(_Args&&... __args)
      |       ^~~~~~~
/usr/include/c++/9/any:273:7: note:   template argument deduction/substitution failed:
/usr/include/c++/9/any: In substitution of ‘template<class _ValueType, class ... _Args> typename std::any::__any_constructible<std::any::_Decay<_ValueType>&, std::any::_Decay<_ValueType>, _Args&& ...>::type std::any::emplace(_Args&& ...) [with _ValueType = std::unique_ptr<int>; _Args = {std::unique_ptr<int, std::default_delete<int> >}]’:
test.cc:7:47:   required from here
/usr/include/c++/9/any:273:7: error: no type named ‘type’ in ‘struct std::enable_if<false, std::unique_ptr<int>&>’
/usr/include/c++/9/any:288:7: note: candidate: ‘template<class _ValueType, class _Up, class ... _Args> typename std::any::__any_constructible<std::any::_Decay<_ValueType>&, std::any::_Decay<_ValueType>, std::initializer_list<_Up>, _Args&& ...>::type std::any::emplace(std::initializer_list<_Up>, _Args&& ...)’
  288 |       emplace(initializer_list<_Up> __il, _Args&&... __args)
      |       ^~~~~~~
/usr/include/c++/9/any:288:7: note:   template argument deduction/substitution failed:
test.cc:7:47: note:   ‘std::unique_ptr<int>’ is not derived from ‘std::initializer_list<_Up>’
    7 |   a.emplace<std::unique_ptr<int>>(std::move(x));

Any ideas?

like image 462
Andrew Tomazos Avatar asked Jul 19 '26 19:07

Andrew Tomazos


1 Answers

The class std::any is copyable. Despite its name, it cannot wrap "any" and all types. Specifically, it cannot wrap non-copyable types. std::unique_ptr is not copyable. std::unique_ptr cannot be stored in std::any.

like image 177
eerorika Avatar answered Jul 21 '26 09:07

eerorika



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!