我想向列表中插入一些元素。
我真正想做的是使用“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
期间不会改变在跑。通过将指针插入到列表中,您实际上是在复制它。这意味着无论是否a
是 const
无论是否,您生成的列表项都将是您在开始时指定的类型。
将列表设为 list<int const* const>
您确保插入的任何指针以后都无法更改,并且只有在显式删除 const
后才能更改指向它的值。你的指针的性质。插入它是可能的,因为添加 const
总是隐式可能的
关于c++ - 指向 const 数据和 C++ 列表的 const 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525791/