Аргумент по умолчанию в функции [C ++] - PullRequest
3 голосов
/ 14 декабря 2009

Я пытался сделать что-то вроде этого:

int& g(int& number = 0)
{
//maybe do something with number
    return number;
}

но это не работает. Это должно быть передано по ссылке. Спасибо за любую помощь.

P.S. Я думаю, что «связанные вопросы», появляющиеся при вводе заголовка, - это хорошая идея, но я также думаю, что они должны отображаться только в том случае, если они связаны с конкретным языком, т. Е. Для меня совершенно бесполезно смотреть на тему с похожей проблемой но в рубине.

Ответы [ 4 ]

11 голосов
/ 14 декабря 2009

Если вы действительно хотите это сделать:

  • сделать ссылку константой, чтобы к ней можно было привязать временное значение
  • поставить по умолчанию в объявлении функции, а не в определении

Например:

// header
const int & g( const int & number = 0 );


// implementation
const int & g( const int & number )
{
//maybe do something with number
    return number;
}

PS. Публикуйте ваши жалобы о том, как SO работает на Meta, а не здесь (несмотря на все свои преимущества - ответ на этот вопрос показал, что они по-прежнему не исправили ошибку кода после списка)

4 голосов
/ 14 декабря 2009

У вас есть неконстантная ссылка, что означает, что вы можете изменить референд. Но по умолчанию используется константа 0.

Действительно ли имеет смысл использовать эту функцию по умолчанию?

0 голосов
/ 14 декабря 2009

Ваша идиома неверна.

Глобальная функция в принципе никогда не должна возвращать ссылку - кроме как, например, скрытие глобальной переменной. Этот случай приемлем, однако использование сомнительно: если переменная уже была глобальной, зачем скрывать ее за вызовом функции?

Если ваша цель - изменить аргумент, зачем давать возвращаемое значение? Полезно только если вы, например, вернуть старое значение - и это должно быть сделано «по значению», а не «по ссылке».

<code>
int g(int& arg) {
   int oldarg( arg );
   // maybe modify arg
   // return old value of arg
   return oldarg;
}

или:

<code>
const int& g(int& arg) {
    static int accumulator;
    accumulator += arg;
    return accumulator;
}

Где, в последнем случае, передача аргумента по ссылке и / или возврат аккумулятора по ссылке не требуется.

ура, ч.

0 голосов
/ 14 декабря 2009

Неконстантная ссылка не может привязываться к временной (буквальной).

Здесь, вероятно, было бы наиболее целесообразно взять аргументы и вернуть значением и оставить вызывающей стороне возможность присваивать результат обратно переменной (если они этого хотят): k = g(k);

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

int& g(int&);

int g()
{ 
    int arg = 0;
    return g(arg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...