Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;GCC 4.3.2字符数组向量错误_C++_Arrays_Vector_Destructor - Fatal编程技术网

C++ C++;GCC 4.3.2字符数组向量错误

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

它的问题与这个bug类似

但原因不同(见下文)

对于以下C++中的示例程序:

#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;