STD ::前向和模板类型扣除

Std::forward and template type deduction

本文关键字:类型 STD      更新时间:2023-10-16

我已经编写了以下小程序,以了解std :: forward的工作方式。

#include <iostream>
#include <memory>
template<class T>
void foo3(T&& bar){
    std::cout<<"foo3&&"<<std::endl;
}
template<class T>
void foo3(T& bar){
    std::cout<<"foo3&"<<std::endl;
}
template<class T>
void foo(T&& bar){
    std::cout<<"foo&&"<<std::endl;
    foo3(std::forward<T>(bar));
}
template<class T>
void foo(T& bar){
    std::cout<<"foo&"<<std::endl;
    foo3(std::forward<T>(bar));
}
int main(int argc, char * argv []){
    int i = 1;
    foo(2);
    foo(i);
    return 0;
}

我希望以下输出:

"foo&&"
"foo3&&"
"foo&"
"foo3&"

但是,我得到以下结果,我无法解释:

"foo&&"
"foo3&&"
"foo&"
"foo3&&"

因此,如果使用lvalue调用foo,我希望foo将转发LVALUE并调用Foo3的LVALUE版本。但是,所有时间foo3(t&amp;&amp;)被调用。我对std ::前进的工作方式完全错误或有微妙的错误了解吗?甚至更糟糕的是,该代码应该按照我的预期工作,也许我弄乱了编译器的实施?btw.i'm使用G 7.2

我是否理解std ::前进的工作完全错误

是。std::forward用于转发参考,而void foo(T&)中的bar不是。如果您不尊重这一点,您会得到一些奇怪的行为。

了解为什么您需要了解std::forward实际上做什么。这只是一个演员

static_cast<T&&>(t)

其中tstd::forward的参数。因此,foo的最后呼叫看起来像这样:

std::cout<<"foo&"<<std::endl;
foo3(std::forward<int>(bar));

T被推荐为 int,如果看一下演员阵容,您会发现它会将 bar铸成rvalue参考,而不是像您预期的那样的lvalue参考。

相关文章: