É possível dar um valor padrão a um parâmetro de uma função enquanto passamos o parâmetro por referência. em C ++
Por exemplo, quando tento declarar uma função como:
virtual const ULONG Write(ULONG &State = 0, bool sequence = true);
Quando faço isso, ocorre um erro:
erro C2440: 'argumento padrão': não é possível converter de 'const int' para 'unsigned long &' Uma referência que não é para 'const' não pode ser associada a um não-lvalue
c++
pass-by-reference
default-value
Drew Noakes
fonte
fonte
WxWidgets style guide says "don't use templates" and they have good reasons
<- parafuso std :: vector, eu digoRespostas:
Você pode fazer isso para uma referência const, mas não para uma não const. Isso ocorre porque o C ++ não permite que um temporário (o valor padrão neste caso) seja vinculado a uma referência não constante.
Uma maneira de contornar isso seria usar uma instância real como padrão:
mas isso é de uso prático muito limitado.
fonte
Isso já foi dito em um dos comentários diretos à sua resposta, mas apenas para declará-lo oficialmente. O que você deseja usar é uma sobrecarga:
Usar sobrecargas de funções também traz benefícios adicionais. Em primeiro lugar, você pode usar como padrão qualquer argumento que desejar:
Também é possível redefinir os argumentos padrão para funções virtuais na classe derivada, o que evita a sobrecarga:
Existe apenas uma situação em que um padrão realmente precisa ser usado, e é em um construtor. Não é possível chamar um construtor de outro e, portanto, essa técnica não funciona nesse caso.
fonte
d.f2(); // f2(int) called with '0' b.f2(); // f2(int) called with '0'
Ainda existe a velha maneira C de fornecer argumentos opcionais: um ponteiro que pode ser NULL quando não está presente:
fonte
Este pequeno modelo irá ajudá-lo a:
Então você será capaz de:
fonte
ByRef
viver, em termos de memória? Não é um objeto temporário que seria destruído ao deixar algum escopo (como o construtor)?Não, não é possível.
A passagem por referência implica que a função pode alterar o valor do parâmetro. Se o parâmetro não for fornecido pelo chamador e vier da constante padrão, o que a função deve mudar?
fonte
Há duas razões para passar um argumento por referência: (1) para desempenho (nesse caso, você deseja passar por referência const) e (2) porque você precisa da capacidade de alterar o valor do argumento dentro da função.
Eu duvido muito que passar um longo tempo sem sinal em arquiteturas modernas esteja atrasando você demais. Portanto, estou assumindo que você pretende alterar o valor de
State
dentro do método. O compilador está reclamando porque a constante0
não pode ser alterada, pois é um rvalue ("não-lvalue" na mensagem de erro) e imutável (const
na mensagem de erro).Simplificando, você quer um método que pode mudar o argumento passado, mas por padrão você deseja passar um argumento que não pode mudar.
Em outras palavras, as não
const
referências têm que se referir a variáveis reais. O valor padrão na assinatura da função (0
) não é uma variável real. Você está tendo o mesmo problema que:Se você realmente não pretende alterar
State
dentro do método, pode simplesmente alterá-lo para umconst ULONG&
. Mas você não terá um grande benefício de desempenho com isso, então eu recomendo alterá-lo para um não-referênciaULONG
. Percebi que você já está retornando aULONG
e tenho uma leve suspeita de que seu valor é o valor deState
após quaisquer modificações necessárias. Nesse caso, eu simplesmente declararia o método assim:Claro, não tenho certeza do que você está escrevendo ou para onde. Mas essa é outra questão para outra hora.
fonte
Você não pode usar um literal constante para um parâmetro padrão pelo mesmo motivo que você não pode usar um como um parâmetro para a chamada de função. Os valores de referência devem ter um endereço, os valores de referência constantes não precisam (ou seja, podem ser valores r ou literais constantes).
Certifique-se de que seu valor padrão tem um endereço e você está bem.
Usei esse padrão algumas vezes onde tinha um parâmetro que poderia ser uma variável ou nulo. A abordagem normal é fazer com que o usuário passe um ponteiro, neste caso. Eles passam um ponteiro NULL se não quiserem que você preencha o valor. Eu gosto de abordagem de objeto nulo. Facilita a vida do chamador sem complicar terrivelmente o código do receptor.
fonte
Acho que não, e o motivo é que os valores padrão são avaliados como constantes e os valores passados por referência devem poder mudar, a menos que você também declare que é uma referência constante.
fonte
Outra forma poderia ser a seguinte:
então as seguintes chamadas são possíveis:
fonte
fonte
No caso de OO ... Dizer que uma determinada classe tem e "Padrão" significa que esse padrão (valor) deve ser declarado em seguida e pode ser usado como um parâmetro padrão ex:
No seu método ...
Esta solução é bastante adequada, pois, neste caso, "Paginação padrão global" é um único valor de "referência". Você também terá o poder de alterar os valores padrão em tempo de execução, como uma configuração de "nível gobal", por exemplo: preferências de navegação de paginação do usuário e etc.
fonte
É possível com o qualificador const para o estado:
fonte
fonte
Também há um truque bastante sujo para isso:
Neste caso, você deve chamá-lo com
std::move
:É apenas uma alternativa engraçada, eu totalmente não recomendo usar em código real!
fonte
Eu tenho uma solução alternativa para isso, veja o seguinte exemplo sobre o valor padrão para
int&
:Você pode fazer isso para qualquer tipo de dados trivial que desejar, como
bool
,double
...fonte
Defina 2 funções de sobrecarga.
fonte
A resposta é bastante simples e não sou muito bom em explicar, mas se você quiser passar um valor padrão para um parâmetro não const que provavelmente será modificado nesta função é usá-lo assim:
fonte