【问题标题】:Is it possible to store a reference in a std::any?是否可以将引用存储在 std::any 中?
【发布时间】:2019-06-15 18:30:21
【问题描述】:

我正在尝试一些事情并提出以下问题:是否有可能在 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&amp; 不知何故不起作用。我在代码中做错了什么,还是通常无法将引用存储在 std::any 中?

【问题讨论】:

  • 顺便说一句,当您尝试从参考中创建std::any 时,您的编译器没有抱怨吗?当我尝试时,我的做了,所以我切换到指针。 (“医生,当我做这个时会很痛。”“那就不要做那个。”)然后寻找洞察力,我进行了搜索,将我带到了这里。

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


【解决方案1】:

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

[any.cons]

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

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

  3. 效果:构造一个any类型的对象,其中包含一个VT类型的对象,直接用std::forward&lt;T&gt;(value)初始化。

【讨论】:

  • @jan.sende 或指针。如果它们不拥有动态资源,它们并不危险。
  • @CruzJean 我知道。然而,我通常以相当实用的风格编写我的代码,这让我可以尽情地放弃指针以支持引用。因此,如果可能的话,我会避免使用指针,因为我不喜欢混合使用 .-&gt; 访问权限...
猜你喜欢
  • 1970-01-01
  • 2023-02-02
  • 2017-06-12
  • 2021-07-19
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多