2015-09-28 94 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

相关问题