2010-11-21 18 views
9

私はLinuxのgcc環境で作業しています。デフォルト値のクラスである関数の引数を初期化する必要があります。 私はクラスの一時的なインスタンスと、それは、このようなエラーになりことを行います。「[関数の引数]のデフォルトの引数は、[クラス名]を入力した 例えば:デフォルト値のクラスである関数の引数を初期化する方法

void foo(std::wstring& str = std::wstring()) 

エラー: 'のデフォルト引数std :: & STRをwstringのは、のstd :: wstringの 『このコードはエラーなしまたはVC++で警告してコンパイルされ PS」と入力している』。私は、デフォルト値をinitilizeするにはどうすればよい

を?

+0

あなたが達成しようとしていますか?私には、あなたが何をしているのか無意味に見えます。 – Simone

+0

@Simone - これは恐らくデフォルト値のアドベンチャーと参照による送信の両方を取得する試みです。 – rkellerm

+0

非const参照へのバインディングは標準に準拠していませんが、VC++では拡張AFAIKとして使用できます。 –

答えて

8

これはコンパイルされていないはずです。 rvalueを非const参照にバインドしようとしています。 std::wstring const & strと言っても問題ありません。

9

あなただけ作成することができます関数のオーバーロード:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

しかし、私は本当にポイントがありません。

編集: つまり、この関数の目的はほぼ確実に入力文字列を変更することです。後でアクセスできない空の入力文字列を提供する場合、なぜ迷惑でしょうか?

+0

関数の目的は、入力文字列をまったく変更せずに取得することもできます。参照渡しは、コピーコンストラクタが呼び出されないようにすることもできます。 – rkellerm

+0

例えば文字列ではなく、バッファであるか、または詳細なログのようないくつかのデータがメソッドによってそこに置かれているが、結果だけを気にするなど、役に立つかもしれない多くの状況があります。あなたの解決策はそれにもかかわらず標準の準拠したコードで穏やかに問題を解決します:) –

+0

@ rursw1はい、そのような場合 - ** const **参照を渡さないと、私はその関数のインターフェースが何とか間違っていると思います。 – Simone

3

rvaluesに非const参照をバインドすることはできません。値渡しが働くだろう:

void foo(std::wstring str = std::wstring()) 

または通過参照ツーのconstによって:

void foo(const std::wstring& str = std::wstring()) 
+0

私はあなたの最後の文を本当に理解していません。たとえコンパイラが一時的なコピーを最適化していないとしても、空の文字列をコピーするのはどれくらいの費用がかかりますか?一時的なものがなくなったら、何が残っていますか? –

+0

@Charles:ユーザー*が引数として文字列を提供する場合はどうなりますか?次に、C++ 03でコピーする必要があります。 – fredoverflow

+0

申し訳ありませんが、あなたのコメントにデフォルトの引数を使用しているとお考えでした。いずれにしても、ユーザーが一時的な文字列を提供する場合は、多くの場合、C++ 03で省略することができます。コピーは必ずしも発生する必要はありません。 –