0

通过值传递函数的返回对象是否合法?我有一个函数,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());
}
4

2 回答 2

3
b.processA(a.getA());

不,它甚至不会编译。原因是a.getA()返回一个临时对象,不能绑定到非常量引用类型。

但是,如果您将参数 const 引用设置为:

void processA(A const & a) 

然后就好了。

注意:MSVC++ 提供对非常量引用的临时对象绑定作为扩展。它不是标准的。

于 2012-06-14T06:40:40.737 回答
2

所以基本上你问的是:

X f();
void g(X& x);

g(f());

是否合法?

作为安全预防措施,非成本参考不能绑定到临时参考。所以以上是不合法的。

但是以下是合法的:

X f();
void g(const X& x);

g(f());

临时对象将一直存在,直到 g 返回。

第一个版本合法的原因是因为 g 所做的任何更改都将被丢弃,那么您为什么要这样做呢?它很可能表示逻辑错误,因此作为语言设计决策,它是编译时错误。

于 2012-06-14T06:42:12.513 回答