具有类型推导的构造函数中的通用引用
Universal reference in constructor with type deduction
如何在带有类型推导的模板化 class 构造函数中使用普遍的尊重。我尝试了所有选项,但没有任何效果。
考虑示例:
#include <vector>
template<class T> struct A {
A(T&& a) { }
};
template<class T> struct B {
B(T& a) { }
};
template<class T> struct C {
template<class T2> C(T2&& a) {}
};
template<class T> void foo(T&& a) { }
auto get_r_value() {
return std::vector<int>(100);
}
std::vector<int>& get_l_value() {
static std::vector<int> v(100);
return v;
}
int main() {
foo(get_r_value()); // ok
foo(get_l_value()); // ok
A a1(get_l_value()); // error!
A a2(get_r_value()); // ok
B b1(get_l_value()); // ok
B b2(get_r_value()); // error!
C c1(get_l_value()); // error!
C c2(get_r_value()); // error!
}
如果你真的想使用通用引用,你必须使用结构 C
,因为在 A
中你实际上声明了一个右值引用,而不是转发(通用)引用。
您可以使用用户定义的 deduction guide
修正 C
的扣除
template <typename T>
C(T&&) -> C<std::remove_cvref_t<T>>;
请注意,演绎指南需要 C++17
如何在带有类型推导的模板化 class 构造函数中使用普遍的尊重。我尝试了所有选项,但没有任何效果。
考虑示例:
#include <vector>
template<class T> struct A {
A(T&& a) { }
};
template<class T> struct B {
B(T& a) { }
};
template<class T> struct C {
template<class T2> C(T2&& a) {}
};
template<class T> void foo(T&& a) { }
auto get_r_value() {
return std::vector<int>(100);
}
std::vector<int>& get_l_value() {
static std::vector<int> v(100);
return v;
}
int main() {
foo(get_r_value()); // ok
foo(get_l_value()); // ok
A a1(get_l_value()); // error!
A a2(get_r_value()); // ok
B b1(get_l_value()); // ok
B b2(get_r_value()); // error!
C c1(get_l_value()); // error!
C c2(get_r_value()); // error!
}
如果你真的想使用通用引用,你必须使用结构 C
,因为在 A
中你实际上声明了一个右值引用,而不是转发(通用)引用。
您可以使用用户定义的 deduction guide
修正C
的扣除
template <typename T>
C(T&&) -> C<std::remove_cvref_t<T>>;
请注意,演绎指南需要 C++17