[英]The member variable of a lvalue object is rvalue?
我发现左值对象的成员变量被识别为右值,我想知道为什么。 这是我的示例:
#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对其进行了测试。
这并没有证明任何有关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&&)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.