簡體   English   中英

什么是C ++ 11中的2D矢量構造破壞變化?

[英]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) ,其中Tvector<int> 但是,這會嘗試將22隱式轉換為臨時vector<int> (以便將其綁定到const T& )。 vector大小構造函數的顯式性禁止它。

閱讀其他SO問題 ,這是一個不同的問題。

STL

暫無
暫無

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

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