【问题标题】:Const pointer to const reference C++ [closed]指向 const 引用 C++ 的 const 指针 [关闭]
【发布时间】:2017-10-25 09:36:31
【问题描述】:

如何将 const 引用或地址存储到 const someType& 对象?

#include<iostream>
#include<list>

const int &foo( int& a) 
{
   return a;
}

int main()
{
    int a = 5;
    const int& p = foo(a);

    std::list<const int&> _list;
    _list.push_back(p);

    return 0;
}

【问题讨论】:

  • 您面临的具体问题是什么?
  • 使用标准容器时 - 容器必须能够移动对象。这意味着您不能拥有引用容器。常量或其他。
  • 存储的对象要满足Assignable的要求。由于引用仅在声明时初始化一次,因此您可以将它们放在任何容器中。
  • 如果您需要容器中的类引用对象,std::reference_wrapper 可能适合您

标签: c++ list reference constants


【解决方案1】:

您的代码无法编译。问题出在这里:

std::list<const int&> _list;

当您声明 std::list&lt;T&gt; 时。 T 必须满足CopyAssignableCopyConstructible 的要求。但是const 和引用都不是可分配的。


除了你的问题,我认为建议std::reference_wrapper 的解决方案并不好。因为当一个对象被删除时,它在该列表中的引用将悬空。最好的办法是使用智能指针。

【讨论】:

  • 关于使用std::reference_wrapper的好话,一定要记住!
【解决方案2】:

正如 UKMonkey 所评论的,您不能将常量引用直接存储在 std 容器中。但是,std::cref 可以存储在此类容器中并包装一个常量引用。请注意,您需要 C++11。

编辑:请注意 Hi I'm Frogatto's warning 关于使用它的信息。除非您有非常令人信服的理由使用std::cref,否则最好坚持他提到的替代方案(智能指针)。

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多