2015-09-28 95 views
1

http://en.cppreference.com/w/cpp/container/vector/vector列出了所有的向量ctors。 但是,以下兩個構造函數會導致編譯問題。通常在調用一個過程中,我們會結束調用其他過程。如何明確提到std :: vector的構造函數?

vector(size_type count, 
       const T& value, 
       const Allocator& alloc = Allocator()); 
vector(std::initializer_list<T> init, 
     const Allocator& alloc = Allocator()); 

而且它通常歸結爲改變{}到()或反過來使事情工作。

有沒有辦法讓Ctor的選擇清晰?而不用擔心方括號。

P.S.-如果你把正確的括號,下面的代碼完美的作品。

vector{elem1, elem2}; // Initializer list version 
vector(vector_size, elem); // A vector of size `vector_size` all the items having value = elem 
+0

我不明白你的問題。你在問什麼? – Barry

+0

我不明白這個問題何時出現。你能否舉一個例子來說明選擇使用哪一種模糊不清? – dingalapadum

+0

std :: vector v {4,false};不編譯。 – gjha

回答

2

在列表初始化期間選擇所述構造的過程中,任何initializer_list<E>構造函數強烈優選比任何其他構造。也就是說,如果它完全可以稱之爲(即使它最終因縮小等原因而不合格),它將被選中。

這導致與vector一個奇怪的怪癖,你只需要記住:如果你有一個vector<I>其中I是一些整數類型,你碰上傳遞兩個積分參數構造函數的問題:

vec{a, b}; // calls std::initializer_list<I> ctor, because it can 
vec(a, b); // std::initializer_list<I> ctor isn't viable because this isn't 
      // list-initialization, so constructs a vector of size 'a' with 
      // value 'b' 

所以,把你的例子:

vec{4, false}; 

這將調用初始化列表構造,即使你想要做的是創造的4個布爾變量是所有矢量。該構造函數不可行,因爲4上的縮小轉換。這就是爲什麼它不會編譯。如果你想使用的大小/計數的構造函數,你必須使用括號(即不做列表初始化):

vec(4, false); 

這僅僅是不可或缺的類型,因爲對於非整數類型的問題初始化列表構造函數根本不可行:

std::vector<Foo> vec{4, Foo{}}; // creates a vector of 4 Foos 
+0

必須使用括號來選擇合適的構造函數。沒有工作? – gjha

+0

@GautamJha你是什麼意思「沒有工作」?只要知道語法是什麼意思,並使用正確的版本,在這種情況下'()'。 *是「解決方法」。 – Barry

+0

@GautamJha Brackets ='[]'。大括號='{}'。括號='()'。看不到任何*括號* – dingalapadum

相關問題