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 参照型にバインドできない一時オブジェクトを返すためです。

ただし、パラメーターの const 参照を次のようにすると、次のようになります。

void processA(A const & a) 

それなら大丈夫です。

: MSVC++ は、非 const 参照への一時オブジェクト バインディングを拡張機能として提供します。標準ではありません。

于 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 に答える