我的gcc版本是4.8.3 20140624.我可以使用is_pod
,is_trivial
,is_standard_layout
,但在尝试is_trivially_copyable
,is_constructible
和{时失败{1}},也许更多。错误消息为is_default_constructible
。
这里的问题是什么?它们甚至得到当前海湾合作委员会的支持吗?谢谢!
答案 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_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
答案 2 :(得分:8)
GCC(在本例中为libstdc ++)根据类型特征的标准化提案的早期版本实现了几个具有不同非标准名称的类型特征。具体做法是:
std::has_trivial_copy_constructor<int>::value
这只提供了std::is_trivially_copyable
的完整实现所提供的部分信息,因为有一个简单的复制构造函数是必要的,但对trivially copyable类型来说还不够。
答案 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
进行编译