http://en.cppreference.com/w/cpp/container/vector/vector列出了所有向量。但是以下两个构造函数会导致编译问题。通常,在呼叫一个的过程中,我们会结束呼叫另一个。
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)
通常归结为将 {} 更改为 () 或反之亦然,以使事情正常进行。
有没有办法让ctor的选择变得清晰?不用担心括号。
PS-如果你放了正确的括号,下面的代码就可以完美工作。
vector{elem1, elem2}; // Initializer list version
vector(vector_size, elem); // A vector of size `vector_size` all the items having value = elem
Run Code Online (Sandbox Code Playgroud)
在列表初始化期间选择构造函数的过程中,任何initializer_list<E>构造函数都优先于任何其他构造函数。也就是说,如果完全有可能调用它(即使它最终由于缩小等原因而格式不正确),就会选择它。
这会导致一个奇怪的怪癖,vector您只需记住:如果您有一个vector<I>where Iis 某种整型类型,则会遇到将两个整型参数传递给构造函数的问题:
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'
Run Code Online (Sandbox Code Playgroud)
就拿你的例子来说吧:
vec{4, false};
Run Code Online (Sandbox Code Playgroud)
这将调用初始化列表构造函数,即使您想要做的是创建一个由 4 个 bool 组成的向量,这些向量都是false. 该构造函数不可行,因为4. 这就是它无法编译的原因。如果要使用大小/计数构造函数,则必须使用括号(即不进行列表初始化):
vec(4, false);
Run Code Online (Sandbox Code Playgroud)
这只是整数类型的问题,因为对于非整数类型,初始化列表构造函数根本不可行:
std::vector<Foo> vec{4, Foo{}}; // creates a vector of 4 Foos
Run Code Online (Sandbox Code Playgroud)