引数を参照渡しする理由は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);
もちろん、あなたが何を書いているのか、どこに書いているのかはよくわかりません。しかし、これはまた別の問題です。