jan*_*nde 6 c++ std c++17 stdany
我正在尝试一些事情并提出以下问题:是否有可能在 a 中存储对值的引用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';
}
Run Code Online (Sandbox Code Playgroud)
结果是以下输出:
3
5
3
3
Run Code Online (Sandbox Code Playgroud)
然而,我期待它是:
3
5
3
6
Run Code Online (Sandbox Code Playgroud)
因此,将指针传递给value工作正常。传递 a 也std::reference_wrapper可以value正常工作,但int&以某种方式传递不起作用。我在代码中做错了什么,或者通常不可能将引用存储在std::any?
您不能在其中存储引用,std::any因为对于给定的 type T,构造函数std::any(T)存储一个 type 的值std::decay_t<T>,它删除了引用限定符:
Run Code Online (Sandbox Code Playgroud)template<class T> any(T&& value);
我们
VT是decay_t<T>。要求:
VT应满足Cpp17CopyConstructible要求。效果:构造一个类型
any的对象,该对象包含一个用VT直接初始化的类型对象std::forward<T>(value)。
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |