【发布时间】:2017-03-29 21:40:18
【问题描述】:
我认为通用参考 (T&&) 应该采用任何类型的参考。但以下不起作用。
当我尝试在我正在编写的库中保持 const 正确时遇到了这个问题。我是 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 不拥有任何实际数据,并且包含对实际保存数据的另一个类的引用。我希望这意味着当我允许class A 的成员函数t 接受临时对象时,我不会经常创建间接/复制数据。
【问题讨论】:
-
您没有使用通用引用。 && 不是通用引用,它是右值引用。 T&& 是当 T 是由调用它的类型推断的模板参数时。换句话说,T 必须是模板参数,并且是函数的参数,并且 T 必须是推导的,而不是指定的。
-
所以像
std::vector<T>&&或class_name<Template parameters>&&这样的东西不是通用引用吗?编写通用参考的唯一方法是T&&?我认为必须推导出t成员函数的Cv_2模板参数。 -
如果我想要一个参数可以接受对特定类而不是类的左值和右值引用。这可能吗?
-
@rxu 你可以使用 SFINAE 来限制 T 可以推断为。
-
非常感谢。我试图弄清楚这一天。所以
T&&是唯一的方法来让一个参数同时接受左值和右值引用。
标签: c++ constants universal-reference