'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