http://en.cppreference.com/w/cpp/container/vector/vector列出所有 vector 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
最佳答案
在列表初始化期间选择构造函数的过程中,任何initializer_list<E>
constructor 比任何其他构造函数都强烈推荐。也就是说,如果完全有可能调用它(即使它最终由于变窄等而变得错误),它也会被选中。
这会导致 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 值组成的 vector ,它们都是 false
。 .该构造函数不可行,因为 4
上的缩小转换.这就是它无法编译的原因。如果要使用大小/计数构造函数,则必须使用括号(即不要进行列表初始化):
vec(4, false);
这只是整数类型的问题,因为对于非整数类型,初始化列表构造函数根本不可行:
std::vector<Foo> vec{4, Foo{}}; // creates a vector of 4 Foos
关于c++ - 如何显式提及 std::vector 的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32821873/