2016-12-23 1 views
1

自動指定子を使用して、戻り値がvector<bool>::back()から初期化される変数を作成する場合、変数に参照修飾子があります。ベクトルの参照修飾子とみなされるVC++の自動指定子<bool> :: back

int main() 
{ 
    bool b = true; 
    bool & j = b; 
    auto k = j; 
    k = false; // k is of int type. So, j and i are unaffected. 

    std::vector<bool> vec = { true }; 
    auto l = vec.back(); 
    vec.pop_back(); 
    l = false; // I get a debug assertion here. 
} 

それはタイプだが、変数lが、私が代わりにブール値のint型を使用している場合は、自動指定子は、同様のベクターのために働くタイプstd::_Vb_reference<std::vector< bool, std::allocator<bool>>::_Alty >

を持っているとして、k個の変数がboolを持っています。

VC++のバグですか? 私はMicrosoft Visual C++ 2013を使用しています。

+1

'std :: vector < bool >'はコンテナではありません – Danh

答えて

4

vector<bool>は、実際にはベクトルではありません。 backは参照を返すのではなく、ベクトル内の単一ビットへのアクセスを許可する特別な参照プロキシオブジェクトです。それはプロキシであるため、参照されているビットがまだ存在するかどうかを確認するなど、通常の参照ではできない追加の処理を行うことができます。これは、デバッグビルドでのみ発生しますが(私は願っています)。

問題は、プロキシオブジェクトがコピー可能で、auto変数がうまく参照プロキシのコピーを受け取るのに対して、適切な参照はコンパイラによって取り除かれ、変数は参照値のコピーになります。

関連する問題