簡體   English   中英

預分配2D矢量時,VS2010和GCC4.8.1之間的行為是否不一致?

[英]Inconsistent behaviours between VS2010 and GCC4.8.1 when preallocating a 2D vector?

我通常使用以下聲明來預分配2d向量,它在VS2010和GCC4.8.1中都能正常工作

vector<vector<int> > k(2, vector<int>(3, 0));

但是,我最近注意到另一個更簡單的陳述:

vector<vector<int> > k(2, 3); 

也實現了相同的效果(即在VS2010中定義了2d向量k,其中k.size()== 2和k [i] .size()== 3,對於i = 0到1)。 但是,當我使用GCC4.8.1嘗試此聲明時(通過Dev C ++,打開ISO C ++ 11支持),編譯器報告錯誤:

62 31 D:\\ Dev-Cpp \\ Projects \\ TestProg \\ main.cpp [錯誤]沒有用於調用'std :: vector <std :: vector <int >>> :: vector(int,int)'的匹配函數

如果我將'Language Standard'標志從'ISO C ++ 11'切換到'ISO C ++',那么它會在stl_vector.h中報告錯誤:

1166 59 d:\\ orwelldevcpp \\ mingw64 \\ lib \\ gcc \\ x86_64-w64-mingw32 \\ 4.8.1 \\ include \\ c ++ \\ bits \\ stl_vector.h [錯誤]沒有用於調用'std :: vector <std ::的匹配函數vector <int >>> :: _ M_fill_initialize(std :: vector <std :: vector <int >>> :: size_type,int&)'

我還跟蹤了在VS2010中執行這個令人困惑的構造函數調用,顯然VS將它與'range'構造函數匹配:

template<class _Iter>
    vector(_Iter _First, _Iter _Last)
    : _Mybase()
    {   // construct from [_First, _Last)
    _Construct(_First, _Last, _Iter_cat(_First));
    }

在沒有C ++ 11標准(_M_fill_initialize)的GCC中拋出錯誤的函數調用也由范圍構造函數調用。 所以我認為這意味着GCC也匹配范圍構造函數的構造函數調用,但不知何故無法完成初始化。


所以我在這一點上很困惑:

1:為什么這個函數與范圍構造函數匹配?

2:為什么C ++ 11似乎不允許這樣的匹配?

3:為什么VS在GCC失敗時接受這種用法,即使沒有C ++ 11標志?


非常感謝您的幫助!

這是在VS2012中修復的MSVC錯誤。

在聲明中

vector<vector<int> > k(2, 3);

您正在嘗試構造一個2元素向量,並使用參數3構造一個vector::value_type (即vector<int> )實例。 但是,采用計數的vector<int>構造函數是explicit ,這會導致構造失敗。

C ++ 03聲明如果是構造函數

template< class InputIt >
vector(InputIt first, InputIt last, const Allocator& alloc = Allocator());

使用InputIt整數類型調用,調用應該像調用帶有count和value_type實例的構造函數一樣。

來自C ++ 03標准23.1.1 / 9 [lib.sequence.reqmts]

對於本節和第21節中定義的每個序列:
- 構造函數

  template <class InputIterator> X(InputIterator f, InputIterator l, const Allocator& a = Allocator()) 

應具有與以下相同的效果:

  X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a) 

如果InputIterator是一個整數類型。

這證明了VS2010的行為是一個bug。


gcc錯誤消息在C ++ 03和C ++ 11標准之間有所不同,因為C ++ 11改變了上面引用的要求的措辭。

來自N3337§23.2.3 / 14 [sequence.reqmts]

對於本條款和第21條中定義的每個序列容器:
- 如果是構造函數

  template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()) 

使用不符合輸入迭代器條件的InputIterator類型InputIterator ,然后構造函數不應參與重載InputIterator

C ++ 11不要求構造函數計數和值匹配,因此gcc錯誤消息指出,給定兩個整數參數,沒有找到匹配的構造函數(因為第二個參數不能隱式轉換為vector<int> )。

暫無
暫無

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

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