'Is_trivially_copyable не является членом' std
Моя версия gcc - 4.8.3 20140624. Я могу использовать is_pod
, is_trivial
, is_standard_layout
, но сбой при попытке is_trivially_copyable
, is_constructible
и is_default_constructible
, возможно, больше. Сообщение об ошибке 'xxx' is not a member of 'std'
.
В чем проблема? Поддерживаются ли они даже при поддержке GCC? Спасибо!
Ответы
Ответ 1
Некоторые из них не реализованы. Если мы посмотрим на страницу libstdС++ С++ 11:
Свойства типа перечислены как частично реализованы.
Они перечислены как отсутствующие:
- is_trivially_copyable
- is_trivially_constructible
- is_trivially_default_constructible,
- is_trivially_copy_constructible
- is_trivially_move_constructible
- is_trivially_assignable
- is_trivially_default_assignable
- is_trivially_copy_assignable
- is_trivially_move_assignable
Сказанное:
is_constructible
и is_default_constructible
должны быть доступны. Я могу использовать их успешно в GCC 4.8.2.
#include <type_traits>
#include <iostream>
int main() {
std::cout << std::is_constructible<int>::value << "\n";
std::cout << std::is_default_constructible<int>::value << "\n";
}
[11:47am][[email protected] /tmp] /opt/gcc/4.8.2/bin/g++ -std=c++11 foo.cc
[11:47am][[email protected] /tmp] ./a.out
1
1
Ответ 2
Просто FYI, эти черты теперь реализованы и будут отправлены в GCC 5.
Ответ 3
GCC (libstdС++ в этом случае) реализует несколько признаков типа с разными нестандартными именами в соответствии с более ранней версией заявки на стандартизацию для характеристик типа. В частности:
std::has_trivial_copy_constructor<int>::value
Это обеспечивает только часть информации, которую обеспечивает полная реализация std::is_trivially_copyable
, поскольку необходим конструктор тривиальной копии, но не достаточно для тривиально скопируемого типа.
Пример Live
Ответ 4
Как упоминают другие, версии GCC < 5 не поддерживают std::is_trivially_copyable
из стандарта С++ 11.
Вот что нужно сделать, чтобы немного обойти это ограничение:
// workaround missing "is_trivially_copyable" in g++ < 5.0
#if __GNUG__ && __GNUC__ < 5
#define IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T)
#else
#define IS_TRIVIALLY_COPYABLE(T) std::is_trivially_copyable<T>::value
#endif
Для обычных случаев этого взлома может быть достаточно, чтобы заставить ваш код работать. Остерегайтесь, однако, тонких различий между GCC __has_trivial_copy
и std::is_trivially_copyable
. Предложения по улучшению приветствуются.
Ответ 5
Действительно, реализация GCC в С++ 2011, похоже, не поддерживает 'is_trivially_copyable. См. пункт 20.9.4.3 состояния
Вы можете попробовать установить Clang3.4 и скомпилировать с опцией -std = С++ 1y