Est-il possible de donner une valeur par défaut à un paramètre d'une fonction pendant que nous passons le paramètre par référence. en C ++
Par exemple, lorsque j'essaye de déclarer une fonction comme:
virtual const ULONG Write(ULONG &State = 0, bool sequence = true);
Quand je fais cela, cela donne une erreur:
erreur C2440: 'argument par défaut': impossible de convertir de 'const int' en 'unsigned long &' Une référence qui n'est pas à 'const' ne peut pas être liée à une non-lvalue
c++
pass-by-reference
default-value
Drew Noakes
la source
la source
WxWidgets style guide says "don't use templates" and they have good reasons
<- vis std :: vector, je disRéponses:
Vous pouvez le faire pour une référence const, mais pas pour une référence non const. Cela est dû au fait que C ++ ne permet pas à un temporaire (la valeur par défaut dans ce cas) d'être lié à une référence non const.
Une solution consiste à utiliser une instance réelle par défaut:
mais c'est d'une utilité pratique très limitée.
la source
Cela a déjà été dit dans l'un des commentaires directs à votre réponse, mais simplement pour le déclarer officiellement. Ce que vous voulez utiliser est une surcharge:
L'utilisation de surcharges de fonctions présente également des avantages supplémentaires. Tout d'abord, vous pouvez par défaut n'importe quel argument que vous souhaitez:
Il est également possible de redéfinir les arguments par défaut des fonctions virtuelles dans la classe dérivée, ce qui évite la surcharge:
Il n'y a qu'une seule situation où une valeur par défaut doit vraiment être utilisée, et c'est sur un constructeur. Il n'est pas possible d'appeler un constructeur à partir d'un autre, et donc cette technique ne fonctionne pas dans ce cas.
la source
d.f2(); // f2(int) called with '0' b.f2(); // f2(int) called with '0'
Il existe toujours l'ancienne façon C de fournir des arguments optionnels: un pointeur qui peut être NULL lorsqu'il n'est pas présent:
la source
Ce petit modèle vous aidera:
Ensuite, vous pourrez:
la source
ByRef
live, en mémoire? N'est-ce pas un objet temporaire qui serait détruit en quittant une certaine portée (comme le constructeur)?Non, ce n'est pas possible.
Le passage par référence implique que la fonction peut changer la valeur du paramètre. Si le paramètre n'est pas fourni par l'appelant et provient de la constante par défaut, quelle est la fonction censée changer?
la source
Il y a deux raisons de passer un argument par référence: (1) pour les performances (auquel cas vous voulez passer par référence const) et (2) parce que vous avez besoin de la possibilité de changer la valeur de l'argument à l'intérieur de la fonction.
Je doute fort que passer un temps non signé sur les architectures modernes vous ralentisse trop. Je suppose donc que vous avez l'intention de changer la valeur de l'
State
intérieur de la méthode. Le compilateur se plaint parce que la constante0
ne peut pas être modifiée, car il s'agit d'une rvalue ("non-lvalue" dans le message d'erreur) et non modifiable (const
dans le message d'erreur).En termes simples, vous voulez une méthode qui peut changer l'argument passé, mais par défaut, vous voulez passer un argument qui ne peut pas changer.
Pour le dire autrement, les non-
const
références doivent se référer à des variables réelles. La valeur par défaut de la fonction signature (0
) n'est pas une vraie variable. Vous rencontrez le même problème que:Si vous n'avez pas vraiment l'intention de modifier
State
la méthode, vous pouvez simplement la changer en un fichierconst ULONG&
. Mais vous n'obtiendrez pas un grand avantage en termes de performances, donc je recommanderais de le remplacer par une non-référenceULONG
. Je remarque que vous retournez déjà unULONG
, et j'ai un soupçon sournois que sa valeur est la valeur deState
après toutes les modifications nécessaires. Dans ce cas, je déclarerais simplement la méthode comme suit:Bien sûr, je ne suis pas tout à fait sûr de ce que vous écrivez ou vers où. Mais c'est une autre question pour une autre fois.
la source
Vous ne pouvez pas utiliser un littéral constant pour un paramètre par défaut pour la même raison que vous ne pouvez pas en utiliser un comme paramètre pour l'appel de fonction. Les valeurs de référence doivent avoir une adresse, les valeurs de références constantes n'ont pas besoin (c'est-à-dire qu'elles peuvent être des valeurs r ou des littéraux constants).
Assurez-vous que votre valeur par défaut a une adresse et tout va bien.
J'ai utilisé ce modèle à quelques reprises où j'avais un paramètre qui pouvait être une variable ou une valeur nulle. L'approche régulière consiste à faire passer l'utilisateur dans un pointeur dans ce cas. Ils transmettent un pointeur NULL s'ils ne veulent pas que vous remplissiez la valeur. J'aime l'approche d'objet nul. Cela facilite la vie des appelants sans compliquer terriblement le code de l'appelé.
la source
Je ne pense pas, et la raison en est que les valeurs par défaut sont évaluées en constantes et que les valeurs passées par référence doivent pouvoir changer, à moins que vous ne le déclariez également comme référence constante.
la source
Une autre façon pourrait être la suivante:
alors les appels suivants sont possibles:
la source
la source
En cas de OO ... Dire qu'une classe donnée a et "Default" signifie que cette valeur par défaut (valeur) doit être déclarée en conséquence et alors peut être usd comme paramètre par défaut ex:
Sur votre méthode ...
Cette solution est tout à fait adaptée car dans ce cas, "Global default Pagination" est une seule valeur de "référence". Vous aurez également le pouvoir de modifier les valeurs par défaut au moment de l'exécution comme une configuration de "niveau global" ex: préférences de navigation de la pagination de l'utilisateur et etc.
la source
C'est possible avec le qualificatif const pour l'état:
la source
la source
Il y a aussi un truc assez sale pour cela:
Dans ce cas, vous devez l'appeler avec
std::move
:Ce n'est qu'une solution de contournement amusante, je ne recommande absolument pas de l'utiliser dans du code réel!
la source
J'ai une solution de contournement pour cela, voir l'exemple suivant sur la valeur par défaut pour
int&
:Vous pouvez le faire pour tout type de données trivial que vous souhaitez, tel que
bool
,double
...la source
Définissez 2 fonctions de surcharge.
la source
La réponse est assez simple et je ne suis pas très douée pour expliquer mais si vous voulez passer une valeur par défaut à un paramètre non-const qui sera probablement modifié dans cette fonction, c'est de l'utiliser comme ceci:
la source