下面的代码导致以下编译错误:
error: no matching member function for call to 'push'
st.push(ptr);
如果我为const
中的ptr
参数删除了func
,问题就消失了。因此,这似乎意味着您不能将常量指针推入堆栈。为什么会这样呢?如果我尝试将其推入std::queue
,它也似乎会给出相同的错误,并且我也怀疑其他容器。
#include <iostream>
#include <stack>
void func(const int *&ptr)
{
std::stack<int *> st;
st.push(ptr);
}
int main(int argc, char const *argv[])
{
int i = 2;
auto ptr = &i;
func(ptr);
}
答案 0 :(得分:2)
const指针的目的是确保不能修改指向的对象(至少不能通过此指针)。
如果在将指针推入堆栈时可以将const int*
转换为int*
,则可以通过弹出非const指针来更改对象。这就是为什么此代码无法编译的原因。
解决方案是使堆栈成为const指针堆栈
void func(const int *&ptr)
{
std::stack<const int *> st;
st.push(ptr);
}
现在这还不够:您的问题将错误消息转移给调用者。您可以解决此问题:
int main(int argc, char const *argv[])
{
int i = 2;
const int* ptr = &i; // <------ not auto
func(ptr);
}
为什么?因为该函数希望引用const指针作为参数。传递普通指针ptr
不允许建立对const指针的引用。
如果通过值而不是通过引用传递指针,则无论ptr
是否为const都可以,因为允许编译器将非const指针值隐式转换为const值。
答案 1 :(得分:1)
使堆栈包含const int *
:
void func(const int *&ptr)
{
std::stack<const int *> st; // <== Add const before int * here.
st.push(ptr);
}
说明:
const指针的意思是:您可以读取它所指向的内容,但不能对其进行写操作。非常量指针(即普通指针)可以读取和写入其指向的内容。编译器始终检查您是否仅在分配指针时才加强功能。
您可以将非const指针推入包含const指针的堆栈中。堆栈中的指针将始终是const指针,并且将比原始指针做 less 。
另一方面,您可能不会将const指针推入非const指针的堆栈中(这是您的情况),因为这样您就可以对堆栈中的指针进行比以前允许的更多的操作。
换句话说:您可以始终在此过程中添加const,但永远不能(*)再次删除它。
(*)您可以通过强制转换来删除const
,但是只有在完全知道自己在做什么的情况下,才应该这样做。通常这是不必要的。