2016-07-04 4 views
3

私はそれを理解するには、コードを実行する愚かなものだ...しかし、理解のために、以下の点を考慮してください。のstd ::クラスのメソッドやフィールドに*この以降のアクセスの動き

#include <iostream> 
#include <memory> 
#include <utility> 

struct S; 
void f(S && s); 

struct S { 
    S() : i{std::vector<int>(10, 42)} {} 
    std::vector<int> i; 
    void call_f() { f(std::move(*this)); } 
    void read() { std::cout << " from S: " << i.at(3) << std::endl; } 
}; 

void f(S && s) { std::cout << " from f: " << s.i.at(3) << std::endl; } 

int main() { 
    S s; 
    s.call_f(); 
    s.read(); 
} 

これはg ++とclang ++の両方でコンパイルして実行しますが、std::vector<int>を移動することが期待されます。これをgdbで実行してメモリを調べると、std::moveの後にアドレスがゼロに設定されていないことがわかりましたが、私はPOD以外のタイプの場合には期待していました。 したがって、私はこのコードからセグメンテーションを期待しました。
誰でもこの現象を説明できますか?なぜsも内部フィールドも無効になっていませんか? thisの機能ですか?

+2

セグメンテーションを「期待」しないでください!たとえあなたが(そうしなかった)コードを書いたとしても、それを期待するのは愚かです。 –

+0

std :: move(* this)は何も移動しませんが、fの移動オーバーロードを呼び出すことはコンパイラに指示します。 fの移動オーバーロードの実装がsを混乱させないならば、あなたのインスタンスはまだ良好です。 segfaultが必要な場合は、fの内部でs.iを効果的に動かすものを追加する必要があります。 – rectummelancolique

+3

@ correctummelancolique:こんにちは。これはコメントセクションです。 ↓↓↓↓↓の答えを掲示板/フォーラムの先祖から離れたSEのQ&Aを設定するピアレビュー機能の対象になるように、そこに答えを入れてください。ありがとう! –

答えて

5

std::move実際には何も移動しません。に移動することができます(ちょっと、私はそれに気づいています)。

実際の移動工事を行う場合は、範囲外の例外が表示される可能性があります(std::vector::at)。

void f(S && s) { 
    S steal = std::move(s); 
    std::cout << " from f: " << s.i.at(3) << std::endl; 
} 

GCC 6.1は、私にこの

terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 0) 
bash: line 7: 18043 Aborted     (core dumped) ./a.out 
+0

@LightnessRacesinOrbitそのベクトルには10個の要素が42に初期化されています –

+0

@PiotrSkotnicki:Ahaha whoops –

+0

これは「std :: move」が「ちょっとした誤解」だけでなく、それが何のための絶対に恐ろしい名前なのかです。 Tsk! –

1

std::moveを与える何も動かない - それが唯一の移動CTORまたは移動オペレータように右辺値にバインドすることができ、同じオブジェクトをreferenceingはxValueを返します=を呼び出すことができます。

あなたのコードでは、移動は一度も実行されません。fは、同じオブジェクトに対する右辺の参照を操作するだけです。

fを受け入れる場合は値段でSを入力してください。移動するとiが空になります。

+0

_ "期待した振る舞いが見えるでしょう。 –

+0

フェア十分に、 "あなたは移動の効果を見るだろう"より正確になります。 –

関連する問題