2012-03-20 13 views
1

で次のコードは、Mac OSX上のG ++とVisual Studioに2008 ではなくをコンパイルするのVisual Studio 2008でコンパイルではなく、この参照が問題に関連する理由リファレンス関連の問題グラム++

class A 
{ 
public: 
    A CreateA() 
    { 
    A a; 
    return a; 
    } 
    }; 

class B 
{ 
public: 
    void ComputeWithA 
    (
    A &a // Here, removing the reference solves the problem 
    ) 
    { 
    return; 
    } 
}; 

int main() 
{ 
    A a; 
    B b; 

    b.ComputeWithA(a); // Works 
    b.ComputeWithA(a.CreateA()); // Invalid arguments 'Candidates are: void ComputeWithA(A &)' 

    return 0; 
} 

?どんな説明も大歓迎です。

よろしくお願いいたします。

答えて

3

a.CreateA()は、R値(つまり一時的な値)を与えます。 ComputeWithAは参照、別名L値を求めています。標準では、R-をL-値に変換できないので、MSVCはここで間違っています。

void ComputeWithA(A const &a) // add a const and everything works fine 
3

コードは合法ではないですが、VCはそれを受け入れている:

ただし、この場合は、明示的に許可されているのであなたはconst参照を取ることができます。あなたの関数は一時的なものを返します。これは非const参照(あなたの関数が引数として取る)に束縛することはできません。

const参照でパラメータを取得するように関数を変更できますか?

-1

あなたがメソッドのシグネチャを変更することができない場合は、ロガーを実装する際に、一時的なオブジェクトは、より操作で使用されたので、私は、一度これを使用しました回避策

class A 
{ 
public: 
A& operator()() 
{ 
return *this; 
} 
... 
b.ComputeWithA(a.CreateA()()); 

があります。

+0

この解決策に問題がある場合、私は今すぐ改造されています。 – Marius

+0

まだ非const参照に一時的なバインディングをバインドしています。間接指定のレベルをもう1つ追加しました。 – rubenvb

+0

は同意しますが、コンパイラはうれしくて、呼び出された関数に参照を格納していない限り問題ありません。 – Marius

関連する問題