2012-06-22 61 views
3

在閱讀答案one question on MS Connect site我注意到答覆的以下部分:什麼是2D向量構造在C++ 11中突破變化?

這是標準庫中的幾個重大更改,我是 知道(其他主要的是不可改變的集之一,和2D矢量 構造)。

答案可能被認爲合法的可能性很高,因爲它來自MS員工,致力於實施STL。

那麼,有誰知道他究竟指的是什麼?

+1

可能相關:http://stackoverflow.com/q/8939320/636019 – ildjarn

+1

提供的鏈接連接問題,或者如果它是私有的,至少正確引用你引述工程師。 –

+0

也可能相關:http://stackoverflow.com/q/5759232/636019 – ildjarn

回答

4

我給斯蒂芬發郵件,問他在說什麼。這是他的答案(編輯格式)。這聽起來不像他打算在這裏公佈答案;如果他這樣做,我會刪除這個副本。

從這裏開始,一切都是斯蒂芬說的。

我指的是這樣的:

#include <vector> 
using namespace std; 

int main() { 
    vector<vector<int>> v(11, 22); 
} 

它編譯與VC10 SP1(以下C++ 03),但不與VC11 RTM(以下C++ 11):[剪斷錯誤消息轉儲]

C++ 03 23.1.1 [lib.sequence.reqmts]/9說:

對於此定義的每個序列條款和第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是整型。

這將vector<vector<int>> v(11, 22)轉換爲vector<vector<int>> v(static_cast<size_t>(11), static_cast<vector<int>>(22)),這是有效的。 (static_cast能夠調用顯式的構造,像vector的尺寸構造)

C++ 11 23.2.3 [sequence.reqmts]/14說:

對於定義的每一個序列容器在本條款和第21條:
- 如果構造
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
是帶一個類型InputIterator是沒有資格作爲一個輸入迭代器,然後構造不得參與重載決議。

這將從重載分辨率中刪除(InIt,InIt)ctor。那留下(size_type n, const T& value),其中Tvector<int>。但是,這會試圖隱含地將22轉換爲臨時vector<int>(以將其綁定到const T&)。vector的大小構造函數的明確性禁止這樣做。

閱讀the other SO question,這是一個不同的問題。

STL

+0

感謝您在此發佈回覆。 – ildjarn