【问题标题】:Cannot initialize a vector of const char*/string array with an initializer-list on declaration无法在声明时使用初始化列表初始化 const char*/string 数组的向量
【发布时间】:2018-09-16 09:12:00
【问题描述】:

最初我开始尝试在声明时使用初始化列表初始化 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" } };

但错误仍然存​​在。我尝试了几种牙套组合均无济于事。是否真的可以在声明时使用初始化列表初始化这个结构?

【问题讨论】:

  • 向量的目的是什么?你想要一个包含三个单个字符串元素的向量(即std::vector&lt;std::string&gt;)吗?或者你想要一个向量,其中每个元素都是三个字符串的数组(即std::vector&lt;std::array&lt;std::string, 3&gt;&gt;)?
  • 我没有真正的答案,但 C 数组在 C 和 C++ 类型系统中最多是二等公民,所以如果大多数花哨的东西不起作用,请不要感到惊讶跟他们。试试std::array
  • @Someprogrammerdude 我实际上想要第二个选项,一个包含 3 个 const char*/string 元素的数组的向量。我也在考虑使用 std::array (并有其他解决方案),但仍然想知道为什么这是不可能的,或者它是否真的可能但我不知道该怎么做。
  • 如果你可以使用std::array而不是std::vector,它将编译std::array&lt;const char*[3], 1&gt; v = { { "a", "b", "c" } };
  • 您忘记指定给出该错误的编译器和版本。我从未见过这样的错误。什么是“矩阵”?

标签: c++ c++11


【解决方案1】:

编译失败是因为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

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

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

【讨论】:

  • 所以,问题与 string[3] 相同,因为 string 是 CopyAssignable,但 string[3] 不是。是的,这是有道理的。当我将 const char* 更改为字符串时,我错误地想到了它。谢谢你的解释。
  • 完全正确,原生数组本身就是问题。
【解决方案2】:

问题是 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

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2011-03-06
    • 2022-11-23
    • 2011-04-18
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多