2012-02-11 11 views
2

私のテンプレートの "スマートポインタ"クラスでは、引数としてそれぞれlvalueとrvalueポインタをとる別々のコンストラクタと代入演算子が必要です。どのように関数を書くべきですか? C++ 11ではlvalueまたはrvalueの引数に基づいて関数をオーバーロードすることはできますか?

+1

"ポインタのコンストラクタ"とは何ですか、左辺値/右辺値は気にしないでください。あなたは例を挙げることができますか? –

+1

@GregHewgill:彼はポインタが引数であると言っているように聞こえます。 –

+0

lvalueを指すことができるスマートポインタを作成しようとする – bitwise

答えて

2

右辺値参照を受け入れるオーバーロードは左辺値参照を受け入れる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を持っていると思います。

関連する問題