2017-10-10 10 views
3

私はHereを記述して、左辺値と右辺値の概念を学んでいます。rvalueのアドレスは許可されていますか?

しかし、自分の例を次のように考案すると、VS2017を使ってコンパイルしても何のエラーもなく実行されます。私は、ケース1の場合は、

produceA(10).operator=(A()) 

と同じであることを知りました。しかし、私はまだケース2と3が許される理由を理解していません。事実、ケース2はこの記事で与えられた例と矛盾する。私は実際にこれらの2つのケースで右値のアドレスを取得していますか?彼らは未定義の行動につながるか?

#include <string> 

class A 
{ 
    int data = 1; 
public: 
    A() = default; 

    A(int in) 
    : data(in) 
    {} 

    A& operator=(const A& rhs) 
    { 
     data = rhs.data; 
     return *this; 
    } 
}; 

A produceA(int i) 
{ 
    A a(i); 
    return a; 
} 


int main() 
{ 
    // case 1 
    produceA(10) = A(); 

    // case 2 
    A* pa = &produceA(10); // rvalue? 

    // case 3 
    std::string* pstr = &std::string("Temp"); // rvalue? 

    return 0; 
} 
+0

あなたのサンプルコードはコンパイルされません(http://coliru.stacked-crooked.com/a/a5adcbe34052d925)。どのコンパイラを使用していますか? – Quentin

+0

私はVS2013とVS2017の両方でこれを試しました。どちらもエラーは発生しません。 –

+0

ありがとうございました。ヒントの後に[この1つ](https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug)も見つかります。コマンドオプション/ Zaを使用すると、ケース2と3のエラーが発生します。この拡張の背後にある目的は私にとってとても不思議そうです。 :/ –

答えて

0

&produceA(10)関数から戻さタイプAの匿名の一時のアドレスです。ポインタを設定することはできますが、そのポインタは文全体の有効期間中のみ有効です。

&std::string("Temp")についても同じことが言えます。再び、これは匿名の一時的なアドレスです。

+0

しかし...一時的なアドレスのアドレスを取ることはできません:/ 'エラー:タイプ 'A'の一時的なオブジェクトのアドレスを取る[一時的なアドレス]' – Quentin

関連する問題