'is_trivially_copyable'不是'std'的成员

时间:2014-08-04 16:37:56

标签: c++ c++11 typetraits

我的gcc版本是4.8.3 20140624.我可以使用is_podis_trivialis_standard_layout,但在尝试is_trivially_copyableis_constructible和{时失败{1}},也许更多。错误消息为is_default_constructible

这里的问题是什么?它们甚至得到当前海湾合作委员会的支持吗?谢谢!

5 个答案:

答案 0 :(得分:13)

正如其他人所提到的,GCC版本&lt; 5不支持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

这是一个解决这个限制的黑客:

__has_trivial_copy

对于常见情况,此hack可能足以让您的代码正常工作。但请注意,GCC的std::is_trivially_copyable和{{1}}之间subtle differences。欢迎提出改进建议。

答案 1 :(得分:12)

其中一些没有实施。如果我们查看libstdc++'s c++11 status page

类型属性列为部分实施

他们列为缺失:

  • 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_constructibleis_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

答案 2 :(得分:8)

GCC(在本例中为libstdc ++)根据类型特征的标准化提案的早期版本实现了几个具有不同非标准名称的类型特征。具体做法是:

std::has_trivial_copy_constructor<int>::value

这只提供了std::is_trivially_copyable的完整实现所提供的部分信息,因为有一个简单的复制构造函数是必要的,但对trivially copyable类型来说还不够。

Live example

答案 3 :(得分:8)

仅供参考,这些特征现已实施,将在GCC 5中发布。

答案 4 :(得分:0)

实际上,GCC的C ++ 2011实现似乎不支持'is_trivially_copyable'。见point 20.9.4.3 of the status

您可以尝试安装Clang3.4并使用选项-std = c ++ 1y

进行编译