‘является тривиально копируемым’ не является членом " 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. Предложения по улучшению приветствуются.


просто FYI, эти черты теперь реализованы и будут поставляться в GCC 5.


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