Значение по умолчанию для параметра при передаче по ссылке в C ++ - PullRequest
112 голосов
/ 29 июня 2009

Можно ли задать значение по умолчанию для параметра функции, когда мы передаем параметр по ссылке. в C ++

Например, когда я пытаюсь объявить функцию вроде:

virtual const ULONG Write(ULONG &State = 0, bool sequence = true);

Когда я делаю это, выдает ошибку:

ошибка C2440: «аргумент по умолчанию»: невозможно преобразовать из «const int» в «unsigned long &» Ссылка, которая не относится к const, не может быть связана с ненулевым значением

Ответы [ 16 ]

1 голос
/ 31 января 2012

Другим способом может быть следующее:

virtual const ULONG Write(ULONG &State, bool sequence = true);

// wrapper
const ULONG Write(bool sequence = true)
{
   ULONG dummy;
   return Write(dummy, sequence);
}

тогда возможны следующие звонки:

ULONG State;
object->Write(State, false); // sequence is false, "returns" State
object->Write(State); // assumes sequence = true, "returns" State
object->Write(false); // sequence is false, no "return"
object->Write(); // assumes sequence = true, no "return"
1 голос
/ 29 июня 2009

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

0 голосов
/ 01 декабря 2018

У меня есть обходной путь для этого, см. Следующий пример значения по умолчанию для int&:

class Helper
{
public:
    int x;
    operator int&() { return x; }
};

// How to use it:
void foo(int &x = Helper())
{

}

Вы можете сделать это для любого простого типа данных, например bool, double ...

0 голосов
/ 13 октября 2016

Для этого есть и довольно грязный трюк:

virtual const ULONG Write(ULONG &&State = 0, bool sequence = true);

В этом случае вам нужно позвонить с std::move:

ULONG val = 0;
Write(std::move(val));

Это просто забавный обходной путь, я совершенно не рекомендую использовать его в реальном коде!

0 голосов
/ 14 июня 2012

virtual const ULONG Write (ULONG & State = 0, bool sequence = true);

Ответ довольно прост, и я не очень хорош для объяснения, но если вы хотите передать значение по умолчанию неконстантному параметру, который, вероятно, будет изменен в этой функции, используйте его следующим образом:

virtual const ULONG Write(ULONG &State = *(ULONG*)0, bool sequence =
> true);
0 голосов
/ 27 апреля 2011
void revealSelection(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, bool revealExtent = false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...