左值对象的成员变量是rvalue?

时间:2015-02-21 17:16:08

标签: c++ c++11

我发现左值对象的成员变量被识别为右值,我想知道为什么。这是我的例子:

#include <iostream>
#include <utility>
using std::cout;
using std::endl;

struct CAT
{
    CAT(){}
    int age_;
};


void f(int&& )
{
    cout<<"f(int&&)"<<endl;
}

void f(int &)
{

    cout<<"f(int&)"<<endl;
}


template<typename T>
void foo(T&& t)
{
    f(std::forward<int>(t.age_));
}


int main()
{
    CAT c;  
    foo(c);            //c is lvalue
    foo(std::move(c)); //move(c) is rvalue
}

输出:

f(int&&)
f(int&&)

我使用clang3.6和gcc 4.8.2测试它。

1 个答案:

答案 0 :(得分:4)

这与c没有任何关系。它证明了std::forward<int>(t.age_)的一个问题,当然,它是一个右值表达式。

您应转发t(不是t.age_),因为整个要点是使用T的通用引用:

template<typename T>
void foo(T&& t)
{
    f(std::forward<T>(t).age_);
}

Now it works

g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
f(int&)
f(int&&)