次のコードを検討してください。
void consumeString(std::string str){
/* some code */
}
void passStringObject(){
std::string stringObject = "string literal";
consumeString(stringObject);
}
void passStringLiteral(){
consumeString("string literal");
}
ここで、次の 2 つのケースを考えてみましょう。
1) 関数passStringObject()
が呼び出されます。
2) 関数passStringLiteral()
が呼び出されます。
ケース1では、関数を呼び出すときconsumeString
にpassStringObject
変数stringObject
が関数に渡され、consumeString
(値による呼び出しのため)文字列クラスのコピーコンストラクタが呼び出され、パラメータstrがコピーになると仮定しますstringObject
関数に渡された変数consumeString
。
しかし、関数consumeString
が呼び出されたときにケース 2 では何が起こるでしょうか? 文字列クラスの(オーバーロードされた)代入演算子(バックグラウンドでリテラルを「隠し」変数に割り当てる可能性がありますか?)は、コピーコンストラクターを呼び出して「隠し」変数の値をパラメーターにコピーする前に暗黙的に呼び出されますstr
か?