[英]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.