Есть две причины для передачи аргумента по ссылке: (1) для производительности (в этом случае вы хотите передать по константной ссылке) и (2), потому что вам нужна возможность изменить значение аргумента внутри функции .
Я очень сомневаюсь, что пропуск длинного без знака на современных архитектурах слишком сильно тормозит. Поэтому я предполагаю, что вы собираетесь изменить значение State
внутри метода. Компилятор жалуется, потому что константа 0
не может быть изменена, так как это rvalue («не lvalue» в сообщении об ошибке) и неизменяемый (const
в сообщении об ошибке).
Проще говоря, вам нужен метод, который может изменить переданный аргумент, но по умолчанию вы хотите передать аргумент, который не может измениться.
Другими словами, не const
ссылки должны ссылаться на фактические переменные. Значение по умолчанию в сигнатуре функции (0
) не является реальной переменной. Вы столкнулись с той же проблемой, что и:
struct Foo {
virtual ULONG Write(ULONG& State, bool sequence = true);
};
Foo f;
ULONG s = 5;
f.Write(s); // perfectly OK, because s is a real variable
f.Write(0); // compiler error, 0 is not a real variable
// if the value of 0 were changed in the function,
// I would have no way to refer to the new value
Если вы на самом деле не собираетесь изменять State
внутри метода, вы можете просто изменить его на const ULONG&
. Но вы не получите от этого большого выигрыша в производительности, поэтому я бы рекомендовал изменить его на нереференсный ULONG
. Я заметил, что вы уже возвращаете ULONG
, и у меня есть хитрое подозрение, что его значение равно значению State
после любых необходимых изменений. В этом случае я бы просто объявил метод следующим образом:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
Конечно, я не совсем уверен, что ты пишешь или куда. Но это другой вопрос в другой раз.