http://en.cppreference.com/w/cpp/container/vector/vector列出了所有矢量ctors。 但是下面两个构造函数导致编译问题。通常在调用一个人的过程中,我们结束呼叫其他人。
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 :(得分: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个bool的向量,它们都是false
。由于4
的转换范围缩小,该构造函数不可行。这就是为什么它不会编译。如果要使用size / count构造函数,则必须使用括号(即不进行列表初始化):
vec(4, false);
这只是整数类型的一个问题,因为对于非整数类型,初始化列表构造函数根本不可行:
std::vector<Foo> vec{4, Foo{}}; // creates a vector of 4 Foos