web-dev-qa-db-fra.com

C++ Argument par défaut pour le vecteur <int> &?

J'ai une fonction,

void test( vector<int>& vec );

Comment puis-je définir l'argument par défaut pour vec? j'ai essayé

void test( vector<int>& vec = vector<int>() );

Mais il y a un avertissement "extension non standard utilisée: 'argument par défaut': conversion de 'std :: vector <_Ty>' en 'std :: vector <_Ty> &'"

Y a-t-il une meilleure manière de faire cela ? Au lieu de

void test() {
    vector<int> dummy;
    test( dummy );
}

Cordialement, Voteforpedro

25
voteforpedro

As-tu essayé:

void test(const vector<int>& vec = vector<int>());

C++ n'autorise pas les temporaires à être liés à des références non constantes.

Si vous devez vraiment avoir un vector<int>& (pas un const), vous pouvez déclarer une instance statique et l'utiliser comme valeur par défaut (donc non temporaire).

static vector<int> DEFAULT_VECTOR;

void test(vector<int>& vec = DEFAULT_VECTOR);

Mais attention, DEFAULT_VECTOR sera (peut) être modifié et ne sera pas réinitialisé à chaque appel! Pas sûr que c'est ce que vous voulez vraiment.


Grâce à stinky472 , voici une alternative thread-safe:

Au lieu de fournir une valeur par défaut, vous pouvez également surcharger test() avec une version à paramètre zéro qui appelle l'autre version:

void test()
{
  vector<int> vec;
  test(vec);
}
52
ereOn

Je trouve douteux qu'un argument de référence non -const ait une valeur par défaut. Qu'est-ce que c'est censé vouloir dire? 

Généralement, une fonction prenant une référence non -const signifie "je pourrais changer l'argument". Si l'argument est facultatif pourquoi ne pas passer un pointeur (non -const)? Ainsi, lorsque les appelants ne souhaitent pas transmettre d'arguments, ils peuvent transmettre NULL.
(Voirherepour plus d’informations sur la manière de passer les arguments de la fonction.) 

Edit: Bien, et bien sûr, il y a aussi surcharge. Ajoutez simplement une autre surcharge qui ne prend pas cet argument. 

7
sbi

Nous ne pouvons pas initialiser les références mutables aux temporaires. Seules les références const permettent cela. Ce que vous cherchez est très probablement ceci:

void test( const vector<int>& vec = vector<int>() );

En plus d’éviter les comportements indéfinis, ceci est tout à fait logique, du point de vue de la const-correct. Si vous vouliez que «test» modifie le vecteur d'origine qui lui est transmis, vous n'auriez pas pu fournir de manière raisonnable une valeur par défaut. Il est donc évident que vous utilisez 'vec' ici à des fins de lecture seule et que vous devriez donc en faire une référence const.

3
stinky472

Je sais que cette question a été posée en 2010, mais pour C++ 11, vous pouvez le faire comme ceci:

void test( vector<int>& vec = {}) {
      // Awesome code here
}

Comme indiqué dans cette réponse .

1
JohnJohn

Vous pouvez simplement faire passer un pointeur sur un vecteur et l’initialiser à NULL

void test( vector<int>* vec = NULL );
0
Ahmed Hamdy