为什么我在使用& this时出错?

时间:2015-11-12 19:13:37

标签: c++

我知道this指针在被调用时会隐式传递给成员函数。但是,当我尝试获取this指针的地址(通过&this)时,我得到编译器错误“需要左值”。为什么是这样?

class st
{    
  int a,b;
public :
  void print()
  {      
    cout << &this; //gives lvalue required... why?

    cout << this; //will print address of object.
  }   
}

3 个答案:

答案 0 :(得分:5)

&不是左值,而是右值。来自[class.this]:

  

在非静态(9.3)成员函数的主体中,关键字这是一个prvalue 表达式,其值是调用该函数的对象的地址。类X的成员函数中的类型是X *。如果成员函数声明为const,则其类型为const X *,如果成员函数声明为volatile,则其类型为volatile X *,如果成员函数声明为const volatile,则此类型为const易变的X *。

强调我的

lvalue需要this,因此您无法获取{{1}}的地址。

答案 1 :(得分:0)

因为这个指针是一个右值。这个指针是一个常量值,它像局部变量一样传递给成员函数,因此它的值存储在一个内存位置,当从该函数返回时该位置将变为无效。

答案 2 :(得分:-1)

据推测,您正在尝试打印对象中的值。 cout不知道该怎么做,你必须教它。         cout&lt;&lt; *这个; 如果cout知道怎么做,可能会这样做,但你可以教它。这是一个更自然的c ++示例。 (您还应该考虑构造函数)。

    #include <iostream>
    using namespace std;
    class st
    {
        public:
        int a,b;
    };
    std::ostream& operator<<(std::ostream& s, const st& val)
    {
        return s << "a:" << val.a << " b:" << val.b ;
    }
    int main() {
        st foo;
        foo.a = 1;
        foo.b = 2;
        cout << "foo is " << foo << endl;
    }