保持对函数的返回对象值的引用/指针是否合法?

时间:2012-06-14 06:38:21

标签: c++

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

2 个答案:

答案 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所做的任何更改都将被丢弃,那你为什么要这样做呢?它很可能表示存在逻辑错误,因此作为语言设计决策,它会成为编译时错误。