C++ C++;GCC 4.3.2字符数组向量错误
它的问题与这个bug类似 但原因不同(见下文) 对于以下C++中的示例程序:C++ C++;GCC 4.3.2字符数组向量错误,c++,arrays,vector,destructor,C++,Arrays,Vector,Destructor,它的问题与这个bug类似 但原因不同(见下文) 对于以下C++中的示例程序: #include <vector> int main(int c_, char ** v_) { const int LENGTH = 100; std::vector<char[LENGTH]> ca_vector; return 0; } 我认为这是由于数组到指针的衰减不正确造成的 我的问题是: 语言标准中是否有任何内容阻止在std
#include <vector>
int main(int c_, char ** v_)
{
const int LENGTH = 100;
std::vector<char[LENGTH]> ca_vector;
return 0;
}
我认为这是由于数组到指针的衰减不正确造成的
我的问题是:
语言标准中是否有任何内容阻止在std::vector中存储数组?或者它只是特殊GCC版本中的一个bug
我确实认为应该编译(即4.2.3是正确的)
谢谢
martin是的,在标准中有一些东西停止使用数组 第23节集装箱 存储在这些组件中的对象类型必须满足CopyConstructible的要求 类型(20.1.3),以及可分配类型的附加要求 其中组件是各种容器 20.1.3包括要求该类型必须具有析构函数
我认为它是一个向量,必须复制、分配和删除元素。C++如何知道复制或删除字符[]?< /p> < p>是,标准中使用了使用的数组停止。 第23节集装箱 存储在这些组件中的对象类型必须满足CopyConstructible的要求 类型(20.1.3),以及可分配类型的附加要求 其中组件是各种容器 20.1.3包括要求该类型必须具有析构函数
我认为它是一个向量,必须复制、分配和删除元素。C++如何知道复制或删除字符[]?< /p> < p>请让我知道这个代码的思想。你们已经知道,向量也是一种数组,你们不需要给出初始大小
1D vector -> std::vector<char*> ca_vector;
2D vector -> std::vector<char*,char*> ca_vector;
1D向量->标准::向量ca_向量;
2D矢量->标准::矢量ca_矢量;
请让我知道此代码的含义。你们已经知道,向量也是一种数组,你们不需要给出初始大小
1D vector -> std::vector<char*> ca_vector;
2D vector -> std::vector<char*,char*> ca_vector;
1D向量->标准::向量ca_向量;
2D矢量->标准::矢量ca_矢量;
不,这是不允许的,就像你链接到的问题中不允许那样(我看不出“原因不同”)。这两个问题中的任何一个都不是“bug”。或者至少,编译器中没有bug。就在你的代码中。;)
不能将数组存储在向量中,因为向量要求其元素是可复制构造和可分配的。不,这是不允许的,就像您链接到的问题中不允许这样做一样(我看不出“原因不同”)。这两个问题中的任何一个都不是“bug”。或者至少,编译器中没有bug。就在你的代码中。;)
不能将数组存储在向量中,因为向量要求其元素可复制、可构造和可分配。最简单的解决方案是:
std::vector<boost::array<LENGTH> > ca_vector;
std::vector ca_vector;
这样,您就不必为数组/指针的故事操心了。
你是否真的想这样做,是另一个问题。最简单的解决办法是:
std::vector<boost::array<LENGTH> > ca_vector;
std::vector ca_vector;
这样,您就不必为数组/指针的故事操心了。
另外一个问题是,您是否真的需要它。您不使用std::string的原因是什么?您是说您的代码在GCC 4.2.3中正确编译和执行了吗?它仍然在该系统上编译,是的。而且它似乎很管用。@kmarsh:我已经用std::string(从一开始就应该用std::string)替换了它;我继承了这段代码,但我必须承认,我不知道这是非法的(我现在几乎不使用原始数组);在回答了这些问题之后,现在应该禁止这种行为似乎是合乎逻辑的。我不想去想它为什么能工作到目前为止,它是否真的能工作……你不使用std::string的原因是什么?你是说你的代码在GCC 4.2.3中正确编译和执行了吗?它仍然在那个系统上编译,是的。而且它似乎很管用。@kmarsh:我已经用std::string(从一开始就应该用std::string)替换了它;我继承了这段代码,但我必须承认,我不知道这是非法的(我现在几乎不使用原始数组);在回答了这些问题之后,现在应该禁止这种行为似乎是合乎逻辑的。我不想去想为什么到目前为止它有效,它是否真的有效……你好,谢谢你的回答。我知道向量可以用作数组,正如你正确指出的那样。我想知道的是,上述代码在标准意义上是否合法。我本可以在那里放一个字符串向量,但正如Mark所写,基本C/C++数组不能满足容器元素的要求。@Aykut:std::vector没有任何意义。vector的第二个模板参数不是第二维度的类型(向量只有一个维度)。第二个参数是allocate(默认为标准分配器)。我知道向量可以用作数组,正如你正确指出的那样。我想知道的是,上述代码在标准意义上是否合法。我本可以在那里放一个字符串向量,但正如Mark所写,基本C/C++数组不能满足容器元素的要求。@Aykut:std::vector没有任何意义。vector的第二个模板参数不是第二维度的类型(向量只有一个维度)。第二个参数是allocate(默认为标准分配器)。2D向量看起来类似于:std::vectorHanks作为参考,干得好。我应该自己找到的,但我太迟钝了。其他答案也都是正确的,我在做标记,因为这是最快的。我相信你误读了
std::vector
非常合法,即使int也没有析构函数。您可以执行x=newint(5):删除x;-但是要删除数组,您需要删除[]谢谢您的参考,干得好。我应该找到它的
std::vector<boost::array<LENGTH> > ca_vector;