将常量指针推到std :: stack <t * =“”>会产生编译错误

时间:2019-02-11 20:22:57

标签: c++ pointers stack const push

下面的代码导致以下编译错误:

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);
}

2 个答案:

答案 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,但是只有在完全知道自己在做什么的情况下,才应该这样做。通常这是不必要的。