参考演绎如何运作?

时间:2017-07-20 01:59:41

标签: c++ c++11 rvalue-reference effective-c++ forward-reference

可以复制到this

我读了Effective Modern C++。在Item 1下,我找到了一个通用参考案例:enter image description here

对于最后一个例子f(27);,我在VS2013下进行了测试。

void process(int& x)
{
    std::cout << "int&" << std::endl;
}
void process(int&& x)
{
    std::cout << "int&&" << std::endl;
}
template<typename T>
void f(T&& param)
{
    std::cout << "------------------------------------------------" << std::endl;
    if (std::is_lvalue_reference<T>::value)
    {
        std::cout << "T is lvalue reference" << std::endl;
    }
    else if (std::is_rvalue_reference<T>::value)
    {
        std::cout << "T is rvalue reference" << std::endl;
    }
    else
    {
        std::cout << "T is NOT lvalue reference" << std::endl;
    }
    std::cout << "param is: " << typeid(param).name() << std::endl;

    process(std::forward<T>(param));
    process(param);
}
int getINT()
{
    int x = 10;
    return x;
}
int _tmain(int argc, _TCHAR* argv[])
{   
    f(10);
    f(getINT());

    return 0;

}

这是输出:

------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&
------------------------------------------------
T is NOT lvalue reference
param is: int
int&&
int&

我发现在模板函数中,如果没有std::forward<T>(param),则会调用process(int& x),但根据该书,param的类型应为右值引用,因此{{1}应该被调用。但这种情况并非如此。 我误解了什么吗?

以下是我从其他thread找到的转发引用: enter image description here

1 个答案:

答案 0 :(得分:1)

您将类型与value categories混淆。作为命名参数,param是左值,然后将调用process(param); process(int& x)

这就是为什么我们应该std::forward使用forwarding reference;对于这种情况,std::forward<T>(param)会将param转换为右值,然后会调用process(int&& x)(按预期方式)。