【问题标题】:hold reference object inside std::optional在 std::optional 中保存引用对象
【发布时间】:2021-10-18 04:45:21
【问题描述】:

我在尝试将 std::optional 中的引用对象作为函数参数传递时遇到问题。它不支持存储引用对象吗? 示例 -

void fun(std::optional<ClassA& obj>)

这个错误究竟意味着什么 - static_assert failed due to requirement '!is_reference

static_assert(!is_reference_v&lt;_Tp&gt;)

【问题讨论】:

    标签: c++ stdoptional


    【解决方案1】:

    cpp reference 说得很清楚:

    没有可选的引用;一个程序是非良构的,如果它 用引用类型实例化一个可选项。或者,一个 可选的类型 T 的 std::reference_wrapper 可用于保存 参考。

    所以按照建议使用std:reference_wrapper

    脚注:在 cpp 委员会中启用了 std::optional 中的引用。我们将来可能会得到它们。

    【讨论】:

    • 争论的另一面是已经有一个可选的引用:一个指针
    • @Caleth:是的,所以std::optional&lt;T&amp;&gt; 实现起来很简单。实际上,这与语义有关:T* 在历史上一直背负着不明确的所有权。 std::optional&lt;T&amp;&gt; 绝对不拥有它所引用的对象,将其传递给 delete 会出错。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2021-12-21
    • 2018-02-12
    • 2016-10-20
    • 1970-01-01
    • 2016-12-03
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多