声明时无法使用初始化列表初始化const char * / string数组的向量

时间:2018-09-16 09:12:01

标签: c++ c++11

最初,我开始尝试使用声明时的初始化列表初始化const char * [3]的向量

vector<const char*[3]> v = { { "a", "b", "c" } };

这给出了错误

matrix must be initialized with a brace-enclosed initializer

我认为这可能是由于const char *引起的,尽管它看起来很奇怪,然后将其更改为字符串

vector<string[3]> v = { { "a", "b", "c" } };

但是错误仍然存​​在。我尝试了大括号的几种组合,但无济于事。

在声明时实际上是否可以使用初始化列表初始化该结构?

2 个答案:

答案 0 :(得分:7)

由于std::vector requires its T to be CopyAssignable,因此无法编译。不管它的RHS是什么,该语句都不会编译:

vector<const char*[3]> v = { { "a", "b", "c" } }; // Error

就像这样也不会编译:

std::vector<const char*[3]> v;
const char* charPtrArr[3] { "a", "b", "c" };
v.push_back(charPtrArr); // Error

这只是C-style arrays are not assignable通过使用static_assert在代码中直接演示的事实的特殊情况:

static_assert(std::is_copy_assignable<const char*[3]>()); // Error

或更普遍地说,我猜:

static_assert(std::is_copy_assignable<int[]>()); // Error

如果您真的想要一个std::vector大小为3的数组,并持有char指针,那么这是C ++ 11的无错误解决方法:

vector<array<const char*, 3>> v = { { "a", "b", "c" }, { "d", "e", "f"} };

答案 1 :(得分:4)

问题是C样式数组不能通过复制传递或在函数参数中移动。 结果,此代码将不起作用

vector<const char*[3]> v;
const char* item[3] { "a", "b", "c" };
v.push_back(item); // will not compile

https://wandbox.org/permlink/LumvUzPnYWew7uMu
基本上这是相同的问题,但是涉及初始化列表。

C ++ 11为您提供了解决问题的简单方法:

vector<array<const char*, 3>> v { { "a", "b", "c" }, { "d", "e", "f"} };

https://wandbox.org/permlink/IHNoSrH9BWV1IUoQ