0

可能会重复到这个

我读了有效的现代 C++。在 下Item 1,我找到了一个通用参考的案例: 对于最后一个例子,我在 VS2013 下做了一个测试。在此处输入图像描述

f(27);

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)会被调用,但根据书本, for 的类型param应该是右值引用,所以process(int&& x)应该被调用。但这种情况并非如此。是我误解了什么吗?

这是我从其他线程中找到的转发参考: 在此处输入图像描述

4

1 回答 1

1

您将类型与值类别混淆了。作为命名参数,param是一个左值,然后process(param); process(int& x)会调用 for。

这就是为什么我们应该使用std::forwardwith forwarding referencestd::forward<T>(param)在这种情况下转换param为右值,然后process(int&& x)将被调用(如预期的那样)。

于 2017-07-20T02:03:39.983 回答