2016-06-24 18 views
1
void print(const string& str){ 
    cout << str <<endl;; 
} 

int main(){ 
    print(string("asdf")); 
} 

私はこのように理解することができます 一時的な文字列オブジェクトが作成され、参照によって関数に渡されます。パラメータstrは実際にはその一時的な文字列オブジェクトとまったく同じオブジェクトです。関数のパラメータ文字列参照渡し

しかし、私はprint( "asdf");で呼び出しを置き換えてどうですか? この場合、まさに何が起こっていますか? 私は暗黙の変換が関係していることを知っています。しかし、それはいつ、どのように行われるのか分かりません。 一時的な文字列オブジェクトも作成されていますか?

+4

同じことが暗黙的に行われます。 – songyuanyao

答えて

2

ご理解の方が正しいです。

この場合、どういうことが起こりますか?暗黙的な変換が関係していることは分かっています。

明示的にコンストラクタを呼び出す代わりに、まったく同じことが起こりますが、暗黙的な変換が行われます。


しかし、私はわからないとき、それがどのように行われていますか? cppreferenceから

引用:

暗黙的な変換は、いくつかのタイプT1の発現は、そのタイプを受け付けない文脈で使用されるが、いくつかの他のタイプT2を受け付けるたびに実行される


つまり、一時的な文字列オブジェクトも作成されていますか?

はい。

1

はい、stringので、コンパイラはあなたの質問の場合と同等のコードをビルドします、const char*を取るコンストラクタ(string (const char* s))を有し、このコンストラクタはexplicitをマークされていません。

関連する問題