按值传递函数的返回对象是否合法?
我有一个来自A::getA()
的函数,它按值返回一个对象。
在同一行中引用此值是否合法,请参阅该行
b.processA(a.getA());
请参阅下面的代码:
class A
{
public:
int a;
std::list<int*> m_list;
A(int a)
{
this->a =a;
}
A(A& _a)
{
this->a =_a.a;
m_list.push_back(&a);
}
A getA()
{
A localA(20);
localA.m_list.push_back(&localA.a);
return localA;
}
};
class B
{
public:
char b;
B(char b)
{
}
void processA(A& a)
{
a.a = 1;
processA2(a);
}
void processA2(A& a)
{
a.a = 2;
}
};
void main()
{
B b('a');
A a(11111);
//************
// IS THE FOLLOWING LINE LEGAL??
// I mean, is it legal to pass the return object of the function by value
//************
b.processA(a.getA());
}
答案 0 :(得分:3)
b.processA(a.getA());
没有。它甚至不会编译。原因是a.getA()
返回一个临时对象,该对象不能绑定到非const引用类型。
但是,如果将参数const引用设为:
void processA(A const & a)
那很好。
注意:MSVC ++提供与非const引用的临时对象绑定作为扩展。它不是标准的。
答案 1 :(得分:2)
所以基本上你问的是:
X f();
void g(X& x);
g(f());
是否合法?
作为安全预防措施,非成本参考不能绑定到临时参考。所以上述内容不合法。
但以下是合法的:
X f();
void g(const X& x);
g(f());
在g回归之前,时间将一直存在。
第一个版本是非法的原因是因为g所做的任何更改都将被丢弃,那你为什么要这样做呢?它很可能表示存在逻辑错误,因此作为语言设计决策,它会成为编译时错误。