T&&
普遍的な参照 ( ) は、あらゆる種類の参照を取ることになっていると思いました。しかし、以下は機能しません。
私が書いているライブラリで const-correct をしようとすると、この問題に遭遇します。私は C++ が初めてで、このようなものを見たことがありません。
test.cpp:
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);
}
エラー (でコンパイルg++ test.cpp -std=c++11
):
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
一時オブジェクトを受け入れることを許可するときに、間接/コピー データを常に作成していないことを意味することを願っています。