C++ のデフォルト パラメータの参照について質問があります。
例:SWindows(const std::string&, int, const std::string& flag = "UDP");
このコードがコンパイルされる理由がわかりません (IDE Visual studio 2012)。私にとって、参照はオブジェクトエイリアスです。したがって、この行を宣言することはできません。「フラグ」はすでに存在するはずです。
それで、それはコンパイラの最適化ですか、それとも誤解ですか?
const
左辺値は、一時オブジェクトにバインドできます。それで全部です。したがって、そのコードは合法であり、整形式です。
その一時オブジェクトの有効期間は、存在する限り延長されflag
ます。言うまでもありませんが、一時オブジェクトを非 const 左辺値参照にバインドすることはできません。
const 参照を使用してそれを行うことができます。次のような const 参照で右辺値を使用することもできます。
void SomeFunction(SomeObject const& s)
{ ... };
そして、あなたは呼び出すことができます
SomeFunction(SomeObject());
これを行うことができるのは、その const 参照を言うことで、参照された変数を変更しないことを伝えているからです。それがなければ、あなたはそれconst&
をすることができなかったでしょう。
コードを理解するには
SWindows(const std::string&, int, const std::string& flag = "UDP");
2 つの部分に分割する必要があります。
SWindows(const std::string&, int, const std::string& flag );
SWindows( SomeString, SomeInt, "UDP" );
「UDP」は std::string 型ではないため、最初の引数として文字列リテラルを受け入れるコンストラクターを呼び出すことにより、暗黙的に std::string 型のオブジェクトに変換されます。したがって、最後のステートメントは次と同等です
SWindows( SomeString, SomeInt, std::string( "UDP" ) );
式 std::string( "UDP ) の結果は、const 参照にバインドできる一時オブジェクトです。したがって、const 参照はその一時オブジェクトのエイリアスです。
これは、関数の本体内に定義があるような方法で想像できます
const std::string &flag = std::string( "UDP" );