C++03 では、関数に渡された引数が左辺値か右辺値かを推測する方法がありません。
これが、質問のタイトルに「一時値を値で受け入れる」と書かれている理由だと思います。そのようなメカニズムが存在する場合、その情報に基づいて、パラメーターの型をT&
orにするかどうかを決定する関数 (テンプレート) を作成できます。T
これはまさに、C++11 でサポートされている型推定機構が行うことです。
template<typename T>
void foo(T&& t);
// ^^^
// lvalue of type A is passed: T = A&, signature = foo(A& t)
// rvalue of type A is passed: T = A, signature = foo(A&& t)
しかし、前述のように、C++03 では式の値カテゴリを決定する方法がないため、これは正確には不可能です。
あなたが言及する可能性(すべてのオブジェクトにconst
メンバー関数を強制する)は回避策ではありません(醜いものでさえありません):メンバー関数が all の場合、その入力の状態を変更する必要がないconst
ことを意味します。これは、問題が解決されるfoo()
可能性があることを意味します。const&
オブジェクトの状態を変更するために、これらのconst
メンバー関数に a を実行させるつもりだったのかもしれませんが、 の内部でも同じことができます。これが悪い考えである理由は、どちらの場合も、型が修飾されているオブジェクトに入力を与えることができず、これが当てはまるかどうかわからない可能性があるためです。const_cast<>
foo()
foo()
const