Различное поведение между std deque / vector в MSVCC / g ++ / icc - PullRequest
5 голосов
/ 24 октября 2011

У меня есть очень простой кусок кода;

#include <deque>
#include <vector>

using namespace std;

class A
{
public:
    A(){};
    ~A(){};
    deque<A> my_array; // vector<A> my_array;
};

int main(void)
{
}

Если я скомпилирую этот код и с g ++, и с icc / icpc на linux, он скомпилируется нормально, даже с -Wall он не выдает предупреждений.Если я поменяю деку на вектор, ситуация будет такой же.

Я хотел бы построить этот код на Windows, используя MSVCC (cl), но, к сожалению, он выдает ошибку c2027:

error C2027: use of undefined type 'A'

Однако, если я изменю std::deque на std::vector, он прекрасно компилируется с Visual Studio 2010.

У меня вопрос;такое поведение следует ожидать по какой-то причине?Если да, то почему существуют различия между компиляторами или это ошибка с g ++ / icc или MSVCC?

Ответы [ 2 ]

12 голосов
/ 24 октября 2011

Это неопределенное поведение (как с std::deque, так и с std::vector, так что все, что реализация делает с ним, хорошо, насколько Стандарт касается. Вы создаете экземпляр стандартного контейнера с неполный тип.

При компиляции с g ++, -Wall (и вообще все опции начинаются с -W) касаются только языка. Для библиотечных вопросов, вы должны быть компилируется с -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC. (Если это вызывает производительность проблемы, вы можете удалить два последних -D в оптимизированных сборках.)

0 голосов
/ 24 октября 2011

В дополнение к ответу Джеймса Канзе я обыскал и нашел эту статью доктора Доббса , в которой объясняется позиция стандарта по использованию контейнеров с неполными типами.

Далее он намекает на причину, по которой он работает с vector с, а не deque с, а именно на реализацию. Типичным вектором может быть что-то вроде

class vector<T> {
    T* buff;
    int size;
    // ... snip
};

, что нормально с неполными типами, поскольку у нас есть только указатель на T, но deque вполне может быть реализован таким образом (в VS2010), что он использует T по значению, что делает его несовместимым с неполные типы.

...