2
私のテンプレートの "スマートポインタ"クラスでは、引数としてそれぞれlvalueとrvalueポインタをとる別々のコンストラクタと代入演算子が必要です。どのように関数を書くべきですか? C++ 11ではlvalueまたはrvalueの引数に基づいて関数をオーバーロードすることはできますか?
私のテンプレートの "スマートポインタ"クラスでは、引数としてそれぞれlvalueとrvalueポインタをとる別々のコンストラクタと代入演算子が必要です。どのように関数を書くべきですか? C++ 11ではlvalueまたはrvalueの引数に基づいて関数をオーバーロードすることはできますか?
右辺値参照を受け入れるオーバーロードは左辺値参照を受け入れる1よりも優先されませんので、それは、本当に簡単だが、右辺値のみ右辺値を元に結合することができる:
#include <iostream>
using std::cout;
void f(int*&) {
cout << "lvalue_ptr ";
}
void f(int*&&) {
cout << "rvalue_ptr ";
}
int* get_rvalue_ptr() {
return 0;
}
int main() {
int* ptr1;
f(ptr1);
f(get_rvalue_ptr());
}
// Output: lvalue_ptr rvalue_ptr
(明らかに、上記のオーバーロード構造はあなたのメンバー関数にも適用できます)。
C++ 03でどうやって動くかわかりません。私はBoostがis_rvalue
を持っていると思います。
"ポインタのコンストラクタ"とは何ですか、左辺値/右辺値は気にしないでください。あなたは例を挙げることができますか? –
@GregHewgill:彼はポインタが引数であると言っているように聞こえます。 –
lvalueを指すことができるスマートポインタを作成しようとする – bitwise