Reputation: 860
I was trying some things and came to the following question: Is there a possibility to store references to a value in a std::any
?
I tried the following approaches:
#include <any>
#include <iostream>
#include <functional>
auto func_by_pointer(std::any obj)
{
*std::any_cast<int *>(obj) += 2;
}
auto modify_by_pointer(int &a)
{
func_by_pointer(std::make_any<int *>(&a));
}
auto func_by_reference_wrapper(std::any obj)
{
std::any_cast<std::reference_wrapper<int>>(obj).get() -= 2;
}
auto modify_by_reference_wrapper(int &a)
{
func_by_reference_wrapper(std::make_any<std::reference_wrapper<int>>(a));
}
auto func_by_reference(std::any obj)
{
std::any_cast<int &>(obj) *= 2;
}
auto modify_by_reference(int &a)
{
func_by_reference(std::make_any<int &>(a));
}
int main()
{
auto value = 3;
std::cout << value << '\n';
modify_by_pointer(value);
std::cout << value << '\n';
modify_by_reference_wrapper(value);
std::cout << value << '\n';
modify_by_reference(value);
std::cout << value << '\n';
}
The result is the following output:
3
5
3
3
Yet, I was expecting it to be:
3
5
3
6
Thus, passing a pointer to value
works fine. Passing a std::reference_wrapper
to value
works fine as well, but passing int&
somehow doesn't work. Did I do something wrong in my code, or is it generally not possible to store references inside a std::any
?
Upvotes: 10
Views: 3512
Reputation: 37686
You cannot store references in std::any
because, for a given type T
, the constructor std::any(T)
stores a value of type std::decay_t<T>
, which removes reference qualifiers:
template<class T> any(T&& value);
Let
VT
bedecay_t<T>
.Requires:
VT
shall satisfy theCpp17CopyConstructible
requirements.Effects: Constructs an object of type
any
that contains an object of typeVT
direct-initialized withstd::forward<T>(value)
.
Upvotes: 11