Компиляция с clang не выполняется с libstdc++ 4.4.7 и -std=c++0x

Я пытаюсь использовать clang для компиляции кода на старой машине RHEL5, которая использует libstdc++4.4.7. Когда я включаю флаг -std=c++0x, я получаю:

/usr/lib/gcc/i386-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/bits/vector.tcc:380:19: error: call to implicitly-deleted copy constructor of
  'value_type' (aka 'std::pair<double, double>')
          value_type __x_copy = __x;
                     ^          ~~~
/usr/lib/gcc/i386-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:851:9: note: in instantiation of member function
  'std::vector<std::pair<double, double>, std::allocator<std::pair<double, double> > >::_M_fill_insert' requested here
  { _M_fill_insert(__position, __n, __x); }

Это после того, как я применил патч (который исправлял другие ошибки, но не эту ) на сайте clang. Когда я отключаю -std=c++0x, он работает нормально. Похоже, что патч, возможно, не устранил все проблемы, это известная проблема, и есть ли известное исправление?


person Shep    schedule 27.02.2013    source источник
comment
@Zoidberg, спасибо, исправил ошибку   -  person Shep    schedule 27.02.2013


Ответы (1)


Патч неполный.

Clang прав в том, что код неверен: конструктор копирования должен быть удален, потому что std::pair объявляет конструктор перемещения, но это потому, что clang реализует окончательные правила C++11, а заголовки GCC 4.4 написаны для работы с более ранней версией Черновик C++0x, поддерживаемый GCC 4.4.

Вы сможете исправить это, добавив это в std::pair:

pair(const pair&) = default;
pair& operator=(const pair&) = default;

Это восстанавливает неявно определенные операции копирования, поэтому Clang не удалит их.

person Jonathan Wakely    schedule 28.02.2013
comment
Итак, поправьте меня, если я ошибаюсь, но это должно означать, что у каждого пользователя libstdc++4.4 с Clang такая же проблема. Если эти строки решат проблему, тот, кто поддерживает Clang, может довольно легко внести изменения в патч. - person Shep; 02.03.2013
comment
да, я ожидаю, что у всех, кто использует эту комбинацию, будет такая же проблема. Я думаю, что такая же проблема существует и с shared_ptr в заголовках 4.4 и, возможно, с другими классами. - person Jonathan Wakely; 03.03.2013