【发布时间】:2018-04-30 12:36:33
【问题描述】:
为了帮助你明白这一点,我给出了我的代码:(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。然而,当我使用g++ -std=c++11 main.cpp -o main 在mac 上编译它时,它抱怨道:
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<test> temp {10} 一样初始化向量,这会将向量初始化为大小为 10,而没有任何 explicit 问题。我不知道vector<test> array[2] {{10},{20}} 里面隐藏了什么导致了我的错误。
有趣的是,如果我为类test 提供一个带有一个参数的构造函数(只需取消注释我的代码中的行),编译器根本不会抱怨。但是vector<test> array[2] {{10},{20}}的含义改成了用test分别用10和20初始化的2个test类型对象来初始化向量array[0]。但是我后来尝试的语法vector<test> array[2] {10,20}又错了。
我不知道这里发生了什么,我完全迷路了。 {10,20} 不也是初始化列表类型吗?
如果你能解释一下这里发生了什么,以及如何初始化一个不同大小的向量数组,我真的很感激(请不要使用规避方式)。我想知道语法到底是什么意思。
【问题讨论】:
-
对于初学者,不要使用指向向量的指针,也不要使用
new。使用对象向量并让它完成所有分配。 -
这是一个骗局。要点是列表初始化不允许直接初始化
-
@Ron 谢谢!如果你能解释一下这里发生了什么,我真的很感激。
-
vector<test> *vp = new vector<test>[2] {{10},{20}};->std::vector<std::vector<test>> data = {std::vector<test>(10), std::vector<test>(20)}; -
@PasserBy 谢谢!我在询问之前进行了搜索。
标签: c++ arrays vector initialization initializer-list