Параметр по умолчанию C++ для вектора <интервал> и?

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

void test( vector<int>& vec );

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

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

Но существует предупреждающее "нестандартное используемое расширение: 'параметр по умолчанию': преобразование из 'станд.:: вектор <_Ty>' к 'станд.:: вектор <_Ty> и'"

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

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

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

31
задан voteforpedro 30 June 2010 в 07:39
поделиться

3 ответа

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

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

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

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

static vector<int> DEFAULT_VECTOR;

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

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


Благодаря stinky472 , вот альтернативная поточно-ориентированная альтернатива:

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

void test()
{
  vector<int> vec;
  test(vec);
}
60
ответ дан 27 November 2019 в 21:52
поделиться

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

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

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

7
ответ дан 27 November 2019 в 21:52
поделиться

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

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

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

3
ответ дан 27 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: