7

我正在尝试一些事情并提出以下问题:是否有可能在 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';
}

结果是以下输出:

3
5
3
3

然而,我期待它是:

3
5
3
6

因此,将指针传递给value工作正常。传递 astd::reference_wrapper也可以value正常工作,但是int&以某种方式传递是行不通的。我在我的代码中做错了什么,或者通常不可能将引用存储在 a 中std::any

4

1 回答 1

10

您不能在其中存储引用,std::any因为对于给定的 type T,构造函数std::any(T)存储了 type 的值std::decay_t<T>,这会删除引用限定符:

[任何缺点]

template<class T>
  any(T&& value);
  1. 让。VT_decay_­t<T>

  2. 要求:VT应满足Cpp17CopyConstructible要求。

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

于 2019-06-15T18:34:16.903 回答