2016-11-15 6 views
4

私はユニバーサルリファレンス(T&&)はどんな種類のリファレンスも取っていると思いました。しかし、以下のことはうまくいかない。lvalueをAにバインドできません<Cv2> &&

私が書いているライブラリでconst-correctをしようとすると、この問題が発生します。私はC++には新しく、このようなことは以前には見たことがありません。

ます。test.cpp:(g++ test.cpp -std=c++11してコンパイル)

enum Cv_qualifier { 
    constant, 
    non_const 
}; 
template <Cv_qualifier Cv> class A; 
template<> 
class A<Cv_qualifier::constant> { 
public: 
    template<Cv_qualifier Cv2> 
    void t(const A<Cv2>&& out) {} 
}; 

template <> 
class A<Cv_qualifier::non_const> { 
public: 
    template<Cv_qualifier Cv2> 
    void t(const A<Cv2>&& out) {} 
}; 

int main() 
{ 
    A<Cv_qualifier::non_const> a; 
    A<Cv_qualifier::constant> b; 
    a.t(b); 
} 

エラー:

test.cpp: In function ‘int main()’: 
test.cpp:24:10: error: cannot bind ‘A<(Cv_qualifier)0u>’ lvalue to ‘const A<(Cv_qualifier)0u>&&’ 
    a.t(b); 
     ^
test.cpp:17:10: note: initializing argument 1 of ‘void A<(Cv_qualifier)1u>::t(const A<Cv2>&&) [with Cv_qualifier Cv2 = (Cv_qualifier)0u]’ 
    void t(const A<Cv2>&& out) {} 
     ^

ところで、実際のプログラムでは、class Aは、任意の実際のデータを所有し、含まれていない参照実際にデータを保持する別のクラスに移動します。これは、メンバー関数tclass Aに一時オブジェクトを受け入れることを許可したときに間接/コピーデータを常に作成していないことを意味します。

+3

。 &&は普遍的な参照ではなく、それはr値の参照です。 T &&は、Tが呼び出された型によって演繹されるテンプレートパラメータであるときです。言い換えれば、Tはテンプレートパラメータでなければならず、AND Tの関数に対するパラメータは、指定されていなくて、推論されなければならない。 –

+0

'std :: vector &&'や 'class_name