‘является тривиально копируемым’ не является членом " 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'
.
в чем проблема? Поддерживаются ли они даже нынешним ССЗ? Спасибо!
5 ответов
некоторые из них не реализованы. Если мы посмотрим на страница состояния C++11 libstdc++:
свойства типа указаны как частично.
они перечислены как отсутствует:
- 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_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][wlynch@apple /tmp] /opt/gcc/4.8.2/bin/g++ -std=c++11 foo.cc
[11:47am][wlynch@apple /tmp] ./a.out
1
1
как упоминают другие, версии GCC std::is_trivially_copyable из стандарта C++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
. Предложения по улучшению приветствуются.
GCC (libstdc++ в этом случае) реализует несколько Type-trait С различными, нестандартными именами на ранее вариант предложения по стандартизации для характеристики типа. В частности:
std::has_trivial_copy_constructor<int>::value
это предоставляет только часть информации, что полная реализация std::is_trivially_copyable
обеспечит, поскольку наличие тривиального конструктора копирования необходимо, но недостаточно для тривиально копируемым тип.
действительно, реализация GCC на C++ 2011, похоже, не поддерживает "is_trivially_copyable". См.пункт 20.9.4.3 статуса
вы можете попробовать установить Clang3.4 и скомпилируйте с опцией-std=c++1y