19項 テンポラリーオブジェクトの起源を理解する

テンポラリーオブジェクトの起源を理解する



テンポラリーオブジェクトとは、自動で作成される名前の無いオブジェクトのことです。
テンポラリーオブジェクトは、関数呼び出しのために暗黙の変換が行われるとき関数がオブジェクトを返すときに起こります。



下の例では、関数呼び出しのための暗黙の変換が行われています。

unsigned int countChar(const string &str, char ch);

char buffer[MAX_STRING_LEN];

cout << countChar(buffer, 'c');

countChar()を呼び出すとき、bufferによってstringが作られます
なので、countChar(buffer, 'c')は下のように振る舞います。

countChar(string(buffer), 'c');

このような変換は、引数がオブジェクト型かconst参照型の時に起こります。

引数が非constの参照の時は、関数を呼び出せません。

unsigned int countChar(string &str, char ch); //const string &でない

char buffer[MAX_STRING_LEN];

cout << countChar(buffer, 'c'); //呼び出せない

関数内部でテンポラリーオブジェクトのみが変更されるのを防ぐためです。



関数がオブジェクトを返すときにもテンポラリーオブジェクトは作られます。

const Number operator+(const Number &lhs, const Number &rhs);

この関数の戻り値はテンポラリーオブジェクトです。



テンポラリーオブジェクトはコスト高になる場合があるので、出来る限りなくすようにします。