不断推进指针的std ::堆栈 给出一个编译错误

问题描述 投票:1回答:2

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

error: no matching member function for call to 'push' 
st.push(ptr);

这个问题消失,如果我移除constptr参数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);
}
c++ pointers stack const push
2个回答
2
投票

一个const指针的目的是确保尖锐的物体不能被修改(至少不是从这个指针)。

如果你可以推指针到堆栈时变换qazxsw POI到qazxsw POI,你可以再由坡平非const的指针改变对象。这就是为什么这个代码不编译。

解决的办法是使堆栈指针常量的堆栈

const int*

现在,这是不够的:那么你的问题将转向错误信息给调用者。你可以解决这个问题:

int*

为什么呢?因为函数需要一个const指针作为参数的参考。路过一个正常的指针void func(const int *&ptr) { std::stack<const int *> st; st.push(ptr); } 不允许建立一个const指针的引用。

如果你想通过值传递的指针,而不是通过引用,它会工作int main(int argc, char const *argv[]) { int i = 2; const int* ptr = &i; // <------ not auto func(ptr); } 是否为const或没有,因为编译器允许隐式非const的指针值转换为一个常量之一。


1
投票

使堆栈包含ptr

ptr

说明:

一个const指针的意思是:你可以读取它指向的东西,但你不能写它指向的东西。和一个非const指针(即,正常的指针)可以读取和写入它指向的东西。编译器总是会检查你指定指针时永远只能收紧功能。

你可以按非const指针到含有常量指针堆栈。在堆栈指针永远是const的指针,将能够做的比你原来的指针少。

在另一方面,你可能不推常量指针到非const指针的堆栈(这是你的情况下),因为这样你就能够比你以前被允许在堆栈指针做多。

换句话说:你总是可以在沿途为您const的,但你可能永远不会(*)再次将其删除。

(*)您可以通过铸造除去const int *,但如果你知道你在做什么,你应该只做到这一点。这通常是没有必要的。

© www.soinside.com 2019 - 2024. All rights reserved.