【发布时间】:2020-11-29 03:08:27
【问题描述】:
在玩 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&& 是什么类型?
【问题讨论】:
标签: c++ templates template-specialization forwarding-reference