c++ - 如何显式提及 std::vector 的构造函数?

标签 c++ c++11 vector

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/

相关文章:

c++ - std::array 大小在类包装器实例化时设置

java - 相当于 Java 中的 vector<T>

c++ - vector 数学 - 查找对象是否朝向或远离某个点移动

c++ - 将数组中的某些整数相加

c++ - 由于引用,重载调用不明确

c++ - 析构函数和python

c++ - 线程对象可以在C++ 11中 move 吗?

c++ - 尾随返回类型和右值

c++ - vector 迭代器不可取消引用?

c++ - 使用 Luabind 实例化 lua 类