我发现左值对象的成员变量被识别为右值,我想知道为什么。这是我的例子:
#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测试它。
答案 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_);
}
g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out f(int&) f(int&&)