将指针传递给临时对象

时间:2014-09-18 08:33:48

标签: c++ pointers temporary-objects

我们知道我们可以通过const引用将临时对象传递给函数,如下所示:

class A
{
public:
    A(int _b = 0) 
    {
        b = _b;
    }

    int b;
};

void foo(A& a) {printf("%d", a.b);}
void cfoo(const A& a) {printf("%d", a.b);}

int main(void)
{
    //foo(A(4)); doesn't compile
    cfoo(A(5));
}

但是通过指针传递怎么样? 为什么这会编译?

void pfoo(A* pa) {pa->b = 19;}

int main(void)
{
    pfoo(&A(5));
}

1 个答案:

答案 0 :(得分:3)

  

但是传递匿名变量指针呢?为什么这会编译?

您可能正在使用不符合C ++标准的编译器。

不能获取r值(临时)对象的地址。那不应该编译。


但是,operator&可以重载,因此可以在临时对象上调用它,例如:

struct A
{
    A* operator&() { return this; }
};

在C ++ 11中,临时对象可以绑定到r值引用。之后,r值引用的行为类似于l值,因此可以采用临时对象的地址:

struct A {};

void foo(A*);

void foo(A&& a) { foo(&a); }

int main() {
    foo(A{});
}