在閱讀答案one question on MS Connect site我注意到答覆的以下部分:什麼是2D向量構造在C++ 11中突破變化?
這是標準庫中的幾個重大更改,我是 知道(其他主要的是不可改變的集之一,和2D矢量 構造)。
答案可能被認爲合法的可能性很高,因爲它來自MS員工,致力於實施STL。
那麼,有誰知道他究竟指的是什麼?
在閱讀答案one question on MS Connect site我注意到答覆的以下部分:什麼是2D向量構造在C++ 11中突破變化?
這是標準庫中的幾個重大更改,我是 知道(其他主要的是不可改變的集之一,和2D矢量 構造)。
答案可能被認爲合法的可能性很高,因爲它來自MS員工,致力於實施STL。
那麼,有誰知道他究竟指的是什麼?
我給斯蒂芬發郵件,問他在說什麼。這是他的答案(編輯格式)。這聽起來不像他打算在這裏公佈答案;如果他這樣做,我會刪除這個副本。
從這裏開始,一切都是斯蒂芬說的。
我指的是這樣的:
#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)
,其中T
是vector<int>
。但是,這會試圖隱含地將22
轉換爲臨時vector<int>
(以將其綁定到const T&
)。vector
的大小構造函數的明確性禁止這樣做。
閱讀the other SO question,這是一個不同的問題。
STL
感謝您在此發佈回覆。 – ildjarn
可能相關:http://stackoverflow.com/q/8939320/636019 – ildjarn
提供的鏈接連接問題,或者如果它是私有的,至少正確引用你引述工程師。 –
也可能相關:http://stackoverflow.com/q/5759232/636019 – ildjarn