gpt4 book ai didi

c++ - 为什么在这种情况下模板参数是引用?

转载 作者:行者123 更新时间:2023-12-01 14:47:07 25 4
gpt4 key购买 nike

在玩 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);
}
它打印 010100 , 意思 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com