2016-12-23 7 views
1

При использовании автоматического спецификатора для создания переменной, которая инициализируется возвращаемым значением от vector<bool>::back(), переменная имеет ссылочный классификатор.Спецификатор VC++ для определения вектора <bool> :: назад

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. 
} 

Переменная к имеет bool, как это тип, но переменная л имеет тип std::_Vb_reference<std::vector< bool, std::allocator<bool>>::_Alty >

Если я использую Int вместо BOOL, авто спецификатор работает для вектора а.

Это ошибка в VC++? Я использую Microsoft Visual C++ 2013.

+1

'std :: vector < bool >' не является контейнером – Danh

ответ

4

vector<bool> - особый зверь и не совсем вектор. back не возвращает ссылку, а специальный ссылочный прокси-объект, который разрешает доступ к отдельным битам в векторе. Поскольку он является прокси-сервером, он может выполнять некоторые дополнительные действия, которые не могут выполнять обычные ссылки - например, проверка того, существует ли ссылочный бит. Это происходит только в сборке отладки, хотя (надеюсь).

Ваша проблема связана с тем, что объект-прокси можно копировать, а переменная auto счастливо принимает копию ссылочного прокси, тогда как соответствующая ссылка будет удалена компилятором, а переменная будет копией ссылочного значения ,

 Смежные вопросы

  • Нет связанных вопросов^_^