単純なケースとして、次のコードを考えてみてください。
int func(int lhs, int rhs)
{
return lhs + rhs;
}
int main() {
int a = 1, b = 2, c = 3;
return func(a * c, b * c);
}
func は 2 つの整数を取るため、プログラムはa * c
andの値を計算し、b * c
それらをどこかに保存する必要があります。a
またはb
またはに保存することはできませんc
。したがって、結果のコードは次と同等です。
int lhsParam = a * c;
int rhsParam = b * c;
return func(lhsParam, rhsParam);
繰り返しますが、最後にfunc()
計算値 を返しますlhs + rhs
。コンパイラはそれを新しい場所に保存する必要があります。
整数などの場合、これは非常に単純に思えますが、代わりに考えてみてください
int function(std::string filename);
function("hello");
filename
であるstd::string
必要がありますが、合格しましたconst char*
。したがって、コンパイラが行うことは次のとおりです。
std::string filenameParam = "hello"; // construct a new object
function(filenameParam);
前の例と同じですが、今回は一時オブジェクトを構築していることがより明確になることを願っています。
注:それらを「somethingParam」と呼ぶ規則は、この回答を明確にするためのものです。