2017-02-08 35 views
-1

範囲依存forループの場合、引数従属ルックアップの動作を理解しようとしていました。私は、私の型と同じ名前空間内の自由な関数として自分の型のbeginとendを実装します。ランタイムアサーションに失敗しました。ラッパークラス用の逆参照できないベクターイテレーター(end de()参照外)なし

発現:それを見て取るため

namespace my { 
    struct MyType { 
     std::vector<int> hiddenData; 
     MyType(int i) : hiddenData(i) {} 
    }; 

    auto begin(MyType obj) { 
     return obj.hiddenData.begin(); 
    } 

    auto end(MyType obj) { 
     return obj.hiddenData.end(); 
    } 
} 

void test() { 
    my::MyType m(5); 
    for (auto& e : m) 
     std:: cout << e << std:: endl; 
} 

ありがとう:ベクトルのイテレータ

は、ここに私が書いたサンプル・コードであるdereferncableありません!

+0

【forループでdereferencableないベクトルイテレータ(http://stackoverflow.com/questions/18636941/vector-の可能性のある複製をiterator-not-dereferencecable-in-for-loop) – mutantkeyboard

+0

あなたの 'begin()'と 'end()'関数は意図したとおりに動作しない可能性があります。 –

+0

彼らは基本となるベクトルのbegin()とend()への呼び出しをバイパスします。彼らは問題になるかもしれないと思うが、明白な理由はない。 – ashutosh

答えて

1

これは問題です:

auto begin(MyType obj)

がMyTypeは、一時的なオブジェクトです。このため、このオブジェクトは関数が返っても存在しなくなるため、返されるイテレータは無効です。代わり

、参照を渡す:

auto begin(MyType& obj)

auto end(MyType& obj)

+0

ああそう。ありがとうございました。 – ashutosh

関連する問題