Tipo de argumento de função seguido por * &
Eu tenho algum código escrito por outra pessoa na qual algumas funções recebem argumentos cujos tipos de dados são seguidos por um * &. Estou acostumado a funções que usam um ou outro, por exemplo tomando um "duplo *" ou um "duplo &", mas não ambos. Teria pensado que eles simplesmente cancelariam.
Aqui está um exemplo, e isso é tudo do código deles, que supostamente funciona:
Em um arquivo de cabeçalho, há uma função declarada como:
void someClass::foo(const unsigned int*& ubuff);
Então, no meu arquivo principal, há um ponteiro para alguns UINTs declarados e inicializados como:
unsigned int* pbuff = new UINT[n];
Em seguida, a função someClass :: foo é chamada como:
foo(pbuff);
Ao compilar, recebo o erro "não é possível converter o parâmetro 1 de 'unsigned int *' para 'const unsigned int * &'". Se eu mudar minha chamada de função para a seguinte, ela compila ok:
foo((const unsigned int *&)(pbuff));
Então, minhas perguntas são:
Qual é o objetivo do * &? Ou seja, como isso é diferente de * ou & por si mesmos, e por que eles não se cancelam? E o que isso faz a função esperar? Um endereço? Um valor? O endereço de um endereço? É confuso.
A solução é simplesmente converter um "unsigned int *" para um "const unsigned int * &" ok ou preciso fazer outra coisa?
Apenas mais um exemplo rápido, e isso é completamente de dentro de um arquivo cpp distribuído por outra pessoa, então suponho que isso seja compilado para eles. Eles têm uma chamada de função como
klabels = new int[sz];
EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels, double(sz)/double(STEP*STEP));
Quando tento criar, recebo o erro "'SLIC :: EnforceLabelConnectivity': não é possível converter o parâmetro 1 de 'int *' para 'const int * &'".
Obrigado como sempre.