まず最初に、一時オブジェクトは const 参照にのみバインドできるという標準の命令を理解しています。私が理解しているように、この場合、一時オブジェクトの有効期間は参照の有効期間にバインドされています。
「標準がそう言っているから...」以外に、一時的なものが一般的な(つまり、非定数)参照にバインドされるのを防ぐのはなぜそんなに良い考えなのですか??
いくつかのワークスペースを必要とするルーチンがある場合、次のことを考慮してください。
void foo(std::vector<mytype> &data, std::vector<mytype> &work)
{ // we do something to DATA but we need to use the workspace WORK
// we may resize WORK, write to it, generally use it in a non-const way
// we want to pass WORK as a parameter because we want to have the option
// of pre-allocating it (for efficiency, FOO may, but is not always, called
// inside a loop)
}
foo
次のように孤立した呼び出しを行うのはなぜそんなに悪いのでしょうか。
// case 1
// DATA already created elsewhere
foo(data, std::vector<mytype>() );
もちろん、次のようなこともできます。
// case 2
// DATA already created elsewhere
std::vector<mytype> work;
foo(data, work);
しかし、その後、 の存続期間はwork
囲んでいるブロックの終わりまで延長されますが、これは望ましくない場合があります。
この種のことを回避する方法があることは知っていますが、許可されていないことを除いて、ここでのケース 1 は適切な方法です。