如何明确提及 std::vector 的构造函数?

jha*_*a-G 4 c++ vector c++11

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)

Bar*_*rry 5

在列表初始化期间选择构造函数的过程中,任何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)