2

我想在列表中插入一些元素。
我真正想做的是使用“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);
    }

};

谢谢你的帮助!

4

3 回答 3

2

简短的回答

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

长答案

通过插入 alist<int*>您尝试将您的int const*(pointer to const int) 转换为int*(pointer to int)。

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

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

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

通过将列表放入list<int const* const>您确保以后不能更改任何插入的指针,并且指向它的值只能在明确摆脱const指针的性质后才能更改。插入它是可能的,因为添加const总是隐含的

于 2013-05-13T15:33:34.497 回答
1

更改list以获取指向 的指针const

std::list<const int*> l;

由于您有一个指向const参数的指针,const因此不允许通过隐式转换消除它的 -ness。

于 2013-05-13T15:31:35.373 回答
1

它是 C++ 风格的编译时 const 正确性类型系统的典型高级“问题”之一。

如果您想int *在列表中存储指针,那么您将无法const int *向该列表添加指针(出于显而易见的原因)。这也将强制您的所有insert方法接受int *指针,而不是const int *指针。

我了解,您真正想要表达的是该insert方法本身不会更改指向的数据(并且不会)。但是,如您所见,insert它有一些影响深远的副作用 - 它将指针存储在列表中。insert如果接受const int *指针,这可能会违反 const-correctenss 。

换句话说,仅仅考虑自己在做什么是不够的,考虑其他代码(在这种情况下 - 可以访问相同列表的其他代码)有insert哪些可能性也很重要。在您的情况下,如果您悄悄接受指针insert,它打开的可能性很容易在其他代码中允许 const-correcness 违规。insertconst int *

const_cast当然,在这种情况下,您可以通过使用 forceful s来强加您自己对正确 const 正确性的看法。但它不会看起来很漂亮。

于 2013-05-13T15:45:17.917 回答