【发布时间】:2019-05-13 17:07:44
【问题描述】:
当我不关心返回的 int 数据时,我正在尝试使用重载函数来隐藏将 int 引用传递给实用函数。为什么我需要使用T& 而不是T 作为模板参数?为什么我需要将i定义为右值的中间函数?
class DataClass
{
};
template <typename T>
bool func(T& data, int& i) {
i = 1;
cout << "it worked!" << endl;
}
// I would like to remove this function
template <typename T>
bool func(T& data, int&& i) {
return func(std::forward<T&>(data), std::forward<int&>(i));
}
template <typename T>
bool func(T& data) {
// Why doesn't this line work?
// return func(std::forward<T>(data), std::forward<int>(0));
return func(std::forward<T&>(data), 0);
}
int main(int argc, char ** argv)
{
DataClass d;
func<DataClass>(d);
return 0;
}
【问题讨论】:
-
std::forward仅对转发引用有用。T&不是这样的转发引用,所以你不应该在这里使用std::forward。 -
调用
func(d)不会将DataClass的引用转发到func(d, 0)? -
转发引用仅在您声明对推导模板参数的右值引用时才会出现。即
template <typename T> bool func(T&& data)。 “转发引用”中的“转发”是指转发给定表达式的值类别(左值或右值),而不是值本身。
标签: c++ perfect-forwarding lvalue-to-rvalue