在使用 std::forward 时发现了奇怪的行为。这是一个小例子:
#include <type_traits>
#include <iostream>
template <typename A>
void func(A&&)
{
std::cout
<< std::is_pointer<A>::value
<< std::is_lvalue_reference<A>::value
<< std::is_rvalue_reference<A>::value
<< std::endl;
using B = typename std::remove_reference<A>::type;
std::cout
<< std::is_pointer<B>::value
<< std::is_lvalue_reference<B>::value
<< std::is_rvalue_reference<B>::value
<< std::endl;
}
int main()
{
int* p = nullptr;
func(p);
}
它打印 010
和100
,意思是A
是引用而不是指针,而 std::remove_reference<A>
正如预期的那样是一个指针。
但是为什么会这样呢?我以为A
将是一个指针和 A&&
函数体内的引用。另外, A&
是什么类型?和A&&
如果是这样的话?
最佳答案
这就是forwarding reference作品;当传递左值时,模板参数 A
将被推导为左值引用。对于本例,它是 int*&
,即对指针的左值引用。 (引用折叠后,函数参数的类型也将为 int*&
。)
当传递右值时,A
将被推导为非引用类型。例如,如果您传递类型为 int*
的右值,则 A
将被推导为 int*
。 (那么函数参数的类型将为int*&&
。)
关于c++ - 为什么在这种情况下模板参数是引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63324490/