引数を参照で渡す理由は 2 つあります。(1) パフォーマンスのため (この場合は const 参照で渡したい)、(2) 関数内で引数の値を変更する機能が必要なためです。
最新のアーキテクチャで unsigned long を渡すと、速度が大幅に低下することはないと思います。State
したがって、メソッド内の値を変更するつもりであると想定しています。0
定数は右辺値 (エラー メッセージの「非左辺値」) であり、変更不可 (エラー メッセージの) であるため、定数を変更できないため、コンパイラは不平を言ってい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);
もちろん、あなたが何をどこに書いているのかよくわかりません。しかし、それはまた別の質問です。