c++ - 指向 const 数据和 C++ 列表的 const 指针

标签 c++ list pointers constants

我想向列表中插入一些元素。
我真正想做的是使用“insert3”,因为它保证指针不会改变,数据也不会改变。
但是“insert2”和“insert3”会给出以下错误,而“insert1”则不会:

class A
{
public:
    std::list<int*> l;
    void insert(int* const a)
    {
        l.push_back(a); //works
    }

    void insert2(const int* a)
    {
        l.push_back(a);
        /*
        no instance of overloaded function "std::list<_Ty, _Ax>::push_back [with _Ty=int *, _Ax=std::allocator<int *>]"
            matches the argument list
        */
    }

    void insert3(const int* const a)
    {
        l.push_back(a);
    }

};

感谢您的帮助!

最佳答案

简短回答

您应该使用 list<int const* const>作为 l 的类型相反,然后您可以使用任何插入内容,包括 insert3 .

长答案

通过插入 list<int*>您尝试转换您的int const* (指向 const int 的指针)到 int* (指向 int 的指针)。

由于您要删除不会编辑指针目标的保证,因此这不是隐式可行的。您可以使用const_cast (或 c-cast)如果您确实希望这样做,但通常会放弃 const -ness 是一个非常糟糕的主意(tm)。

为什么要制作指针本身 const不会改变任何事情

如果您使用版本 3 并使用 int const* const (指向 const int 的 const 指针),您不会得到任何比变量 a 多或少的保证。 insert3期间不会改变在跑。通过将指针插入到列表中,您实际上是在复制它。这意味着无论是否aconst无论是否,您生成的列表项都将是您在开始时指定的类型。

将列表设为 list<int const* const>您确保插入的任何指针以后都无法更改,并且只有在显式删除 const 后才能更改指向它的值。你的指针的性质。插入它是可能的,因为添加 const总是隐式可能的

关于c++ - 指向 const 数据和 C++ 列表的 const 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525791/

相关文章:

c++ - 如何使用指针到指针来传递矩阵?

c++ - 如何在另一个表中使用表的最后插入的 id

list - 针对给定编码问题的优化解决方案

python 集合包含与列表包含

c++ - 为什么禁止将 Derived** 转换为 Base*const*?

c - 指向结构的指针在 C 中返回不正确的值

c++ - 从辅助线程使用主线程调用方法

c++ - 在线程中使用 std::string 函数安全吗? (c++)

c++ - 如何用 Boost::python 包装派生模板类?

python - 将连续的整数组合在一起