簡體   English   中英

將initializer_list插入std :: vector時“無效的迭代器范圍”

[英]“Invalid iterator range” while inserting initializer_list to an std::vector

此代碼在Ideone按預期編譯並運行正常:

#include <iostream>
#include <string>
#include <vector>

int main() {

    std::vector<std::wstring> strVec;
    strVec.insert(strVec.end(), { L"black", L"white", L"red" });
    strVec.insert(strVec.end(), { L"blue", L"green" }); // STL exception

    for (auto &i : strVec) {
        std::wcout << i << " ";
    }
    return 0;
}

但是,MSVC(Visual Studio 2013)中的“無效迭代器范圍”失敗。有任何見解嗎?

順便說一句,插入更多的元素,例如在第二個插入,這適用於MSVC:

strVec.insert( strVec.end(), { L"blue", L"green", L"yellow" } );

與容量/大小相關並使一些迭代器無效? 但是第二次insert請求新的迭代器end() ,它必須是有效的,對嗎? 或者......它實際上是關於初始化列表?

注意:不在這里尋找變通方法(大量的) - 只是試圖弄清楚這是否是特定於MSVC的錯誤或者合法錯誤正在發生......

VS 2013選擇了重載vector<T>::insert(const_iterator, const T&) ,從一對指針const wchar*, const wchar*構造wstring const wchar*, const wchar*解釋為一系列字符的開始和結束; 請注意,寬字符串文字會衰減為const wchar*指針。 這就是為什么只有在嘗試精確插入2個元素時才會出現問題的原因。

這是調用堆棧:

msvcp120d.dll!std::_Debug_message(const wchar_t * message, const wchar_t * file, unsigned int line) Line 15 C++
Project1.exe!std::_Debug_range2<wchar_t const *>(const wchar_t * _First, const wchar_t * _Last, const wchar_t * _File, unsigned int _Line, std::random_access_iterator_tag __formal) Line 576   C++
Project1.exe!std::_Debug_range<wchar_t const *>(const wchar_t * _First, const wchar_t * _Last, const wchar_t * _File, unsigned int _Line) Line 584  C++
Project1.exe!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >(const wchar_t * _First, const wchar_t * _Last) Line 860    C++
Project1.exe!main() Line 9  C++

VS 2013是錯誤的,因為[over.ics.rank]

3 - [...]

  • 列表初始化序列L1是比列表初始化序列L2更好的轉換序列,如果:
    • L1轉換為std::initializer_list<X>表示某些XL2不[...]

這已在VS2015中修復。

可能會發生這種情況,因為當您編寫{ L"blue", L"green" }編譯器將它們用作構造值的兩個指針( std::wstring )並將其傳遞給下一個std::vector::insert重載:

insert( const_iterator pos, const T& value ); 

所以從指針L"blue"L"green"運行很可能在程序沒有讀取權限的地方結束,或者它檢查第一個指針是否小於秒,並在它們沒有時拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM