【问题标题】:Passing a pointer to temporary object传递指向临时对象的指针
【发布时间】:2014-09-18 08:33:47
【问题描述】:

我们知道我们可以通过 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));
}

【问题讨论】:

  • 您只是将指针传递给在堆栈上创建的变量。它只是内存中的一个地址,只要该内存有效,它就可以工作。我不太确定这里有什么问题。为什么你认为引用应该起作用而不是指针?
  • 您能否将“匿名变量”改为“临时”。将其视为 (a) 节省打字时间,以及 (b) 准确描述被抛出的数据的实际状态的一种方式。并且foo(A(5)) 无法编译,因为参数 decl 是一个非常量引用,因此不能提供 临时。发送临时地址的 地址 至少应该警告你错了。如果没有,您需要提高编译器警告或丢弃该编译器并获得一个会警告您这种丑陋的编译器。
  • 在 gcc 和 clang error: taking address of temporary。虽然可以用-fpermissive强制编译,地址给出了答案。
  • @GlGuru &A(5) 是一个错误,它不是“指向在堆栈上创建的变量的指针”。右值不能被占用。
  • 谢谢你,我已纠正。

标签: c++ pointers temporary-objects


【解决方案1】:

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

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

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


不过,operator& 可以重载,以便在临时对象上调用它,例如:

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

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

struct A {};

void foo(A*);

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

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

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2021-06-04
    • 2023-02-09
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多