最初,我开始尝试使用声明时的初始化列表初始化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" } };
但是错误仍然存在。我尝试了大括号的几种组合,但无济于事。
在声明时实际上是否可以使用初始化列表初始化该结构?答案 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"} };