2012-07-02 21 views
5

私は、次のコードは、エラーを発生させるべきだと思います。変換::文字列&

std :: stringのコンストラクタがstd :: stringのインスタンスを作成しているのですか?

リファレンスは単なる変数のエイリアスであるため、これは避けるべきです(この例では、リファレンスが参照する型std :: stringの変数はありません)。

コードが正常にコンパイルされる理由を説明する人はいませんか?

ありがとうございます。

答えて

10

定数を参照すると、コンパイラは一時的な(この場合はタイプstd::string)を合成し、その一時的な参照をバインドできます。

しかし、参照がconstオブジェクトではない場合、それはうまくいきません。そのような一時オブジェクトにconstへの参照だけをバインドできます。(少なくとも広く使用されているコンパイラでは同様に参照にバインドする)。

+0

インテリステイングファクト。 1つは毎日勉強している;)。私はあなたの2番目の文章を手に入れませんでした。関数ヘッダが 'void pr(std :: string&aStr)'であれば、一時的な(暗示による)構築はスタンドアートでは不可能ですか? – Paranaix

+0

@Paranaix:正しい - 'pr(std :: string&)'は一時オブジェクトを受け入れることができません。 –

+0

@ JerryCoffinは、コンパイラがtempインスタンスを作成しないようにする方法はありますか? – orchistro

2

あなたが遭遇するのは暗黙の変換です。ここで

は、C++標準(SC22-N-4411.pdf)からの引用である

1 Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (Clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

ので、コンパイラは、ちょうど意図したとおりに動作し、あなたが言及したstd::stringコンストラクタを呼び出します。