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

标签 c++ templates template-specialization forwarding-reference

在使用 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/

相关文章:

c++ - Qt - 图像类 - 非最大抑制 - C++

c++ - 如何在 OpenCv 中轻松检测 2 个 ROI 是否相交?

C++ 中的 PHP 样式 foreach 循环

c++ - 专门化模板中的一些方法

c++ - 部分专用模板的单独实现

c++ - MatrixBase::sqrt() 在 Eigen3 中不起作用

c++ - 为多个 session 保留 XPtr

c++ - 不需要其元素是默认元素和可复制构造的容器

javascript - 如何使用指令动态更改模板?

c++ - 理解(简单?)C++ 部分模板特化