Існує дві причини передавати аргумент за посиланням: (1) для продуктивності (у такому випадку ви хочете передати const посилання) та (2), оскільки вам потрібна можливість змінити значення аргументу всередині функції.
Я дуже сумніваюся, що проходження довго не підписаних сучасних архітектур занадто сповільнює вас. Тому я припускаю, що ви маєте намір змінити значення State
всередині методу. Компілятор скаржиться на те, що константа 0
не може бути змінена, оскільки це значення rvalue ("не-значення" у повідомленні про помилку) та незмінне ( 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);
Звичайно, я не зовсім впевнений, що ти пишеш чи куди. Але це вже інше питання для іншого разу.