是否可以在 std::any 中存储引用?
Is it possible to store a reference in a std::any?
我正在尝试一些事情并遇到以下问题:是否有可能将对值的引用存储在 std::any
中?
我尝试了以下方法:
#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';
}
结果输出如下:
3
5
3
3
然而,我期待它是:
3
5
3
6
因此,将指针传递给 value
可以正常工作。将 std::reference_wrapper
传递给 value
也能正常工作,但传递 int&
不知何故不起作用。我是不是在我的代码中做错了什么,或者通常不可能在 std::any
中存储引用?
您不能在 std::any
中存储引用,因为对于给定类型 T
,构造函数 std::any(T)
存储类型 std::decay_t<T>
的值,这会删除引用限定符:
template<class T>
any(T&& value);
Let VT
be decay_t<T>
.
Requires: VT
shall satisfy the Cpp17CopyConstructible
requirements.
Effects: Constructs an object of type any
that contains an object of type VT
direct-initialized with std::forward<T>(value)
.
我正在尝试一些事情并遇到以下问题:是否有可能将对值的引用存储在 std::any
中?
我尝试了以下方法:
#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';
}
结果输出如下:
3
5
3
3
然而,我期待它是:
3
5
3
6
因此,将指针传递给 value
可以正常工作。将 std::reference_wrapper
传递给 value
也能正常工作,但传递 int&
不知何故不起作用。我是不是在我的代码中做错了什么,或者通常不可能在 std::any
中存储引用?
您不能在 std::any
中存储引用,因为对于给定类型 T
,构造函数 std::any(T)
存储类型 std::decay_t<T>
的值,这会删除引用限定符:
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)
.