[英]What is 2D vector construction breaking change in C++11?
在閱讀MS Connect網站上的一個問題的答案時,我注意到以下部分的答復:
這是我所知道的標准庫中的一些重大變化之一(其他主要變量是不可變集和2D矢量構造 )。
答案可以被認為具有高概率,因為它來自MS員工,致力於實施STL。
那么有人知道他到底指的是什么嗎?
我給斯蒂芬發了電子郵件,問他在說什么。 這是他的答案(為格式編輯)。 這聽起來並不像他打算在這里發布答案; 如果他這樣做,我會刪除這個副本。
從這里開始的一切都是斯蒂芬說的。
我是指這個:
#include <vector>
using namespace std;
int main() {
vector<vector<int>> v(11, 22);
}
它用VC10 SP1編譯(在C ++ 03之后),但不用VC11 RTM編譯(在C ++ 11之后): [snip error message dump]
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
的size構造函數。)
C ++ 11 23.2.3 [sequence.reqmts] / 14說:
對於本條款和第21條中定義的每個序列容器:
- 如果是構造函數
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
使用不符合輸入迭代器條件的InputIterator
類型InputIterator
,然后構造函數不應參與重載InputIterator
。
這將從重載決策中刪除(InIt,InIt)ctor。 留下(size_type n, const T& value)
,其中T
是vector<int>
。 但是,這會嘗試將22
隱式轉換為臨時vector<int>
(以便將其綁定到const T&
)。 vector
大小構造函數的顯式性禁止它。
閱讀其他SO問題 ,這是一個不同的問題。
STL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.