完美转发和引用折叠

引用折叠

引用折叠(Reference Collapsing)是 C++ 中引用类型推导时的一种规则,它决定了多重引用(如 T& &、T&&& 等)会如何被简化成一个最终的引用类型。这个概念通常与模板中的转发引用(T&&)一起使用,特别是在模板函数中传递引用类型时,引用折叠规则会自动生效。

引用折叠规则: 当你在模板中使用转发引用(即 T&&),C++ 会根据传入参数的实际类型来决定最终的引用类型。引用折叠的目的是确保类型的正确性,同时避免多重引用。

C++ 中的引用折叠规则如下:

T& & => T&:两个左值引用折叠成一个左值引用。 T& && => T&:左值引用与右值引用折叠成一个左值引用。 T&& & => T&&:右值引用与左值引用折叠成一个右值引用。 T&& && => T&&:两个右值引用折叠成一个右值引用。

当使用模板时候,传参为T &&时能自动匹配左值右值。

template<typename T>
void f(T&& arg) {
    // 这里 T&& 是转发引用
    // 引用折叠规则会在编译时决定实际的引用类型
    std::cout << "Received argument" << std::endl;
}

而要保持左值和右值时使用,完美转发

完美转发

std::forward(参数)

template <typename T>
void wrapper(T&& arg) {
    // 在这里 arg 是转发引用
    // 我们使用 std::forward 来确保正确地转发给另一个函数
    f(std::forward<T>(arg)); // 完美转发
}
Table of Contents