Como passar um ponteiro duplo não constante como parâmetro constante para outra função?
Meu código:
#include <iostream>
void food(const char** begin, const char** end) {
}
int main(int argc, char** argv) {
food(argv, argv + argc);
}
O erro que recebo:
<source>: In function 'int main(int, char**)':
<source>:8:10: error: invalid conversion from 'char**' to 'const char**' [-fpermissive]
8 | food(argv, argv + argc);
| ^~~~
| |
| char**
<source>:3:24: note: initializing argument 1 of 'void food(const char**, const char**)'
3 | void food(const char** begin, const char** end) {
| ~~~~~~~~~~~~~^~~~~
<source>:8:21: error: invalid conversion from 'char**' to 'const char**' [-fpermissive]
8 | food(argv, argv + argc);
| ~~~~~^~~~~~
| |
| char**
<source>:3:44: note: initializing argument 2 of 'void food(const char**, const char**)'
3 | void food(const char** begin, const char** end) {
|
As outras respostas explicam seu problema imediato.
Aqui eu gostaria de demonstrar uma alternativa (já mencionada em um comentário acima ):
Já que você está usando C++, transforme argc+argv (que na verdade são um legado de C) em um C++
std::vector
destd::string
s.Usar contêineres e strings padrão é muito mais idiomático em C++ do que usar arrays C simples e arrays C char.
Demonstração ao vivo
solução 1: make
main
take aconst char**
(nota: pode não ser possível quandomain
é sequestrado, como feito pelo SDL).solução 2: crie outro
const char*
interiormain
que você possa modificar.Seu código original não pode ser compilado porque dentro dele
food
eu poderia definir*begin
umconst char*
armazenado na memória somente leitura, então no seumain
você terá umchar*
apontando para umconst char
que não estará correto.criar um novo
begin
eend
que já estejaconst char*
evita esse problema, pois quaisquer alterações neles não invalidarãoargv
.Em C++ e C, podemos atribuir a
type*
a aconst type*
. Este não é o caso aqui, no entanto - o problema neste caso é que oconst
qualificador do parâmetro de função não pertence ao ponteiro-para-ponteiro, mas ao "dado ponteiro-para-apontado".Também
argv
está estritamente falando apontando para a memória de leitura/escrita, embora escrever nela seja uma prática questionável.Podemos contornar isso adicionando ponteiros no lado do chamador:
Aqui
*argv
dá umchar*
para os dados e podemos atribuir isso a um somente leituraconst char*
. E então passar um ponteiro para aquele em vez disso.