gpt4 book ai didi

C++ : initialize(new) an array of vector of different initial size

转载 作者:行者123 更新时间:2023-11-30 00:44:08 29 4
gpt4 key购买 nike

为了帮助你明白这一点,我给出了我的代码:(main.cpp),只涉及一个文件。

#include <iostream>
#include <vector>
using namespace std;
class test{
public :
int member {0};
void fun(){cout << "member is " << member << endl;}
test(){}
//test(int param) : member(param){} //this line is commented.
};

int main()
{
vector<test> *vp = new vector<test>[2] {{10},{20}};
//vector<test> array[2] {{10},{20}};//this won't work either.
cout << "size of vp[0] is " << vp[0].size() << endl;
cout << "size of vp[1] is " << vp[1].size() << endl;
return 0;
}

我打算初始化vp[0]尺寸 10 和 vp[1]按尺码 20 .然而,当我在 mac 上编译它时使用 g++ -std=c++11 main.cpp -o main它提示:

main.cpp:14:45: error: chosen constructor is explicit in copy-initialization
vector<test> *vp = new vector<test>[2] {{10},{20}};
^~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:517:14: note:
constructor declared here
explicit vector(size_type __n);
^
main.cpp:14:50: error: chosen constructor is explicit in copy-initialization
vector<test> *vp = new vector<test>[2] {{10},{20}};
^~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:517:14: note:
constructor declared here
explicit vector(size_type __n);
^

在 CentOS Linux 中使用相同的命令,我得到了

main.cpp: In function ‘int main()’:
main.cpp:14:54: error: converting to ‘std::vector<test>’ from initializer list would use explicit constructor ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = test; _Alloc = std::allocator<test>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<test>]’
vector<test> *vp = new vector<test>[2] {{10},{20}};
^
main.cpp:14:54: error: converting to ‘std::vector<test>’ from initializer list would use explicit constructor ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = test; _Alloc = std::allocator<test>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<test>]’

这是怎么回事?为什么它与关键字 explicit 有任何关系? ?我知道 vector 有几个构造函数(例如带有初始化列表类型参数的构造函数)。如果我像 vector<test> temp {10} 这样初始化 vector ,这会将 vector 初始化为大小 10,没有任何 explicit担忧。说到vector<test> array[2] {{10},{20}}就不知道里面藏着什么了这导致了我的错误。

有趣的是,如果我提供类 test使用带有一个参数的构造函数(只需取消注释我的代码中的行),编译器根本不会提示。但是vector<test> array[2] {{10},{20}}的意思更改为初始化 vector array[0]与 2 test使用 10 初始化的类型对象和 20分别。但是语法 vector<test> array[2] {10,20} ,我后来试了,又错了。

我不知道这里发生了什么,我完全迷路了。不是 {10,20}也是初始化列表类型?

如果你能解释一下这里发生了什么,以及如何初始化一个不同大小的 vector 数组(请不要使用规避方式),我将非常感激。我想知道语法的确切含义。

最佳答案

首先,explicit构造函数可以直接初始化,但不能复制初始化。

然后,在aggregate initialization ,

(强调我的)

Each direct public base, (since C++17) array element, or non-static class member, in order of array subscript/appearance in the class definition, is copy-initialized from the corresponding clause of the initializer list.

这意味着 new vector<test>[2] {{10},{20}}; , {10}{20}用于复制初始化 vector<test>要素;然后是 explicit不考虑构造函数。

If I initialize the vector like vector<test> temp {10}, this would initialize vector to be of size 10 without any explicit concerns.

因为 explicit direct initialization 中允许使用构造函数,

Direct-initialization is more permissive than copy-initialization: copy-initialization only considers non-explicit constructors and non-explicit user-defined conversion functions, while direct-initialization considers all constructors and all user-defined conversion functions.

同理new vector<test>[2] {std::vector<test>{10},std::vector<test>{20}};也有效。

顺便说一句:

if I provide class test with a constructor with one argument(just uncomment the line in my code), the compiler does not complain at all.

如果你提供了一个构造器可以用来转换inttest隐含地,那么 {10}可用于构建 std::initializer_list<test> , 然后是 std::vector<test> 的构造函数哪个服用std::initializer_list<test>被调用是因为它总是首选。顺便说一句,如果你制作 test 的构造函数explicit代码也会失败。

关于C++ : initialize(new) an array of vector of different initial size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com