是否可以在std :: any中存储引用?

时间:2019-06-15 18:30:21

标签: c++ c++17 std stdany

我正在尝试一些问题,并提出了以下问题:是否可以在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内存储引用?

1 个答案:

答案 0 :(得分:4)

您不能在std::any中存储引用,因为对于给定类型T,构造函数std::any(T)存储类型为std::decay_t<T>的值,该值将删除引用限定符:

  

[any.cons]

template<class T>
  any(T&& value);
     
      
  1. VTdecay_­t<T>

  2.   
  3. 要求:VT必须满足Cpp17CopyConstructible的要求。

  4.   
  5. 效果:构造一个any类型的对象,其中包含一个用VT直接初始化的std::forward<T>(value)类型的对象。

  6.