【发布时间】: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