4

特定のパラメーターがC++03の右辺値であるかどうかをどのように判断できますか?私はいくつかの非常に一般的なコードを書いていますが、可能であれば参照を取得するか、そうでない場合は新しいオブジェクトを作成する必要があります。オーバーロードして値による値と参照による値を取得し、右辺値の戻り値に値による関数を呼び出させることはできますか?

または、これが右辺値参照がC ++ 0xにある理由であるという非常に不快な気持ちがありますか?

編集:

is_rvalue =!(is_reference || is_pointer)?

4

5 に答える 5

5

C ++ 03では、式が右辺値か左辺値かを判断する方法があるようです(この手法をどれだけよく理解しているかわからないため、どうやら言います)。この手法を使用可能にするには、プリプロセッサマクロがかなり必要であることに注意してください。Eric Nieblerは、それがどのように機能し、BOOST_FOREACHでどのように使用されるかについての素晴らしい記事を書いています。

この記事はかなり読みにくいことに注意してください(少なくとも私にとってはそうです)。Neiblerがその中で言っているように:

これが難解なものであることは間違いありませんが、式の右辺値と左辺値を検出するための堅牢な方法があります。

アーティクルで説明されている右辺値検出を使用すると、C++0xの右辺値参照が解決する問題の少なくとも一部に対処するのに役立つ場合があります。

于 2010-06-11T19:27:32.667 に答える
2

特定のパラメーターがC++03の右辺値であるかどうかをどのように判断できますか?

できません。あなたができることはあなたのクライアントを信頼してごまかすことだけです:

void call_me_with_anything(const T& const_ref)
{
    /* read from const_ref */
}

void call_me_with_rvalue_only_please_i_trust_you(const T& const_ref)
{
    T& ref = const_cast<T&>(const_ref);
    /* write through ref */
}

私はいくつかの非常に一般的なコードを書いています

それなら、C++03はあなたのためにそれをカットしないのではないかと思います。

于 2010-06-11T19:20:52.137 に答える
1

または、これが右辺値参照がC ++ 0xにある理由であるという非常に不快な気持ちがありますか?

あなたは正しいです、あなたはそれをするためにC++0xと右辺値参照を必要とします。

私が考えることができる最も近いことは、左辺値または右辺値のいずれかにバインドできるので、const-referenceによって何かを取ることです(右辺値が一時的なものを構築する必要がある場合はそうします)。そうは言っても、あなたのコードは2つを区別することができません。

于 2010-06-11T19:19:34.197 に答える
1

または、これが右辺値参照がC ++ 0xにある理由であるという非常に不快な気持ちがありますか?

うん。それがまさにC++0xに追加された理由です。C ++でオーバーロードを作成して、右辺値と左辺値を区別することはできません。

于 2010-06-11T19:19:59.173 に答える
1

私はいくつかの非常に一般的なコードを書いていますが、可能であれば参照を取得するか、そうでない場合は新しいオブジェクトを作成する必要があります。

これはあなたが望むことをしませんか?

void f(T& t);
void f(T const& t);

ご了承ください...

T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)
于 2010-06-11T19:52:40.177 に答える