在这样的函数模板中
template <typename T>
void foo(T&& x) {
bar(std::forward<T>(x));
}
如果用右值引用调用,x
内部不是右值引用吗?如果 foo 使用左值引用调用,则无论如何都不需要强制转换,因为它也将是. 也将被推导出为左值引用类型,因此不会改变.foo
foo
x
foo
T
std::forward<T>
x
我进行了一项测试,使用boost::typeindex
和不使用std::forward<T>
.
#include <iostream>
#include <utility>
#include <boost/type_index.hpp>
using std::cout;
using std::endl;
template <typename T> struct __ { };
template <typename T> struct prt_type { };
template <typename T>
std::ostream& operator<<(std::ostream& os, prt_type<T>) {
os << "\033[1;35m" << boost::typeindex::type_id<T>().pretty_name()
<< "\033[0m";
return os;
}
template <typename T>
void foo(T&& x) {
cout << prt_type<__<T>>{} << endl;
cout << prt_type<__<decltype(x)>>{} << endl;
cout << prt_type<__<decltype(std::forward<T>(x))>>{} << endl;
cout << endl;
}
int main(int argc, char* argv[])
{
foo(1);
int i = 2;
foo (i);
const int j = 3;
foo(j);
foo(std::move(i));
return 0;
}
g++ -Wall test.cc && ./a.out
withgcc 6.2.0
和的输出boost 1.62.0
是
__<int>
__<int&&>
__<int&&>
__<int&>
__<int&>
__<int&>
__<int const&>
__<int const&>
__<int const&>
__<int>
__<int&&>
__<int&&>
编辑:我找到了这个答案:https ://stackoverflow.com/a/27409428/2640636显然,
只要你给参数一个名字,它就是一个左值。
那么我的问题是,为什么选择这种行为而不是将右值引用保留为右值,即使它们被赋予了名称?在我看来,整个转发考验可以通过这种方式规避。
Edit2:我不是在问什么 std::forward
。我在问为什么需要它。