Подтвердить что ты не робот

С++ Значение по умолчанию для вектора <int> &?

У меня есть функция,

void test( vector<int>& vec );

Как установить аргумент по умолчанию для vec? Я пробовал

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

Но есть предупреждение "используется нестандартное расширение:" аргумент по умолчанию ": преобразование из" std::vector < _Ty > "в 'std::vector < _Ty > &'"

Есть ли лучший способ сделать это? Вместо

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

С уважением, Voteforpedro

4b9b3361

Ответ 1

Вы пробовали:

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

C++ не позволяет привязывать временные ссылки к неконстантным ссылкам.

Если вам действительно нужно иметь vector<int>& (а не const), вы можете объявить статический экземпляр и использовать его как значение по умолчанию (таким образом, не временное).

static vector<int> DEFAULT_VECTOR;

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

Но будьте осторожны, потому что DEFAULT_VECTOR будет (может) изменяться и не будет reset для каждого вызова! Не уверен, что это то, чего вы действительно хотите.


Благодаря stinky472, это безопасная для потоков альтернатива:

Вместо предоставления значения по умолчанию вы также можете перегрузить test() версией с нулевым параметром, которая вызывает другую версию:

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

Ответ 2

Я считаю, что сомнительно для не- const опорного аргумента имеет значение по умолчанию. Что это значит?

Обычно функция, ссылающаяся на ссылку <const, означает "я могу изменить аргумент". Если аргумент является необязательным, почему бы не передать указатель a (не const)? Таким образом, когда вызывающие абоненты не хотят передавать аргументы, они могут пройти NULL.
(См. здесь для получения дополнительной информации о том, как передавать аргументы функции.)

Изменить: Ну и, конечно же, перегрузка тоже. Просто добавьте еще одну перегрузку, которая не принимает этот аргумент.

Ответ 3

Мы не можем инициализировать изменяемые ссылки на временные. Это допускают только константные ссылки. Скорее всего, вы следуете за этим:

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

Помимо избежания поведения undefined, это логически логично и с точки зрения константы. Если вы хотите, чтобы "test" изменял исходный вектор, передаваемый ему, вы не смогли бы разумно предоставить значение по умолчанию. Таким образом, очевидно, что вы используете "vec" здесь для целей только для чтения и поэтому должны сделать это ссылкой на константу.

Ответ 4

Я знаю, что этот вопрос задавали в 2010 году, но для С++ 11 вы можете сделать это следующим образом:

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

Как указано в этом ответе.