繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM