私はユニバーサルリファレンス(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
は、任意の実際のデータを所有し、含まれていない参照実際にデータを保持する別のクラスに移動します。これは、メンバー関数t
のclass A
に一時オブジェクトを受け入れることを許可したときに間接/コピーデータを常に作成していないことを意味します。
。 &&は普遍的な参照ではなく、それはr値の参照です。 T &&は、Tが呼び出された型によって演繹されるテンプレートパラメータであるときです。言い換えれば、Tはテンプレートパラメータでなければならず、AND Tの関数に対するパラメータは、指定されていなくて、推論されなければならない。 –
'std :: vector &&'や 'class_name &&'のようなものは汎用的な参照ではありませんか?ユニバーサルリファレンスを書く唯一の方法は 'T &&'です。私は、 't'メンバ関数の' Cv_2'テンプレートパラメータを推論しなければならないと考えました。 –
クラスの種類ではなく、特定のクラスに対するl値とr値の両方の参照を受け入れることができる引数が必要な場合。それは可能ですか? –