1

C++ のデフォルト パラメータの参照について質問があります。

例:SWindows(const std::string&, int, const std::string& flag = "UDP");

このコードがコンパイルされる理由がわかりません (IDE Visual studio 2012)。私にとって、参照はオブジェクトエイリアスです。したがって、この行を宣言することはできません。「フラグ」はすでに存在するはずです。

それで、それはコンパイラの最適化ですか、それとも誤解ですか?

4

3 に答える 3

3

const左辺値は、一時オブジェクトにバインドできます。それで全部です。したがって、そのコードは合法であり、整形式です。

その一時オブジェクトの有効期間は、存在する限り延長されflagます。言うまでもありませんが、一時オブジェクトを非 const 左辺値参照にバインドすることはできません。

于 2013-11-05T21:49:29.207 に答える
1

const 参照を使用してそれを行うことができます。次のような const 参照で右辺値を使用することもできます。

void SomeFunction(SomeObject const& s)
 { ... };

そして、あなたは呼び出すことができます

SomeFunction(SomeObject());

これを行うことができるのは、その const 参照を言うことで、参照された変数を変更しないことを伝えているからです。それがなければ、あなたはそれconst&をすることができなかったでしょう。

于 2013-11-05T21:55:13.140 に答える
1

コードを理解するには

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" );
于 2013-11-05T22:09:32.017 に答える