“is_trivially_copyable”不是“std”的成员

新手上路,请多包涵

My gcc version is 4.8.3 20140624. I can use is_pod , is_trivial , is_standard_layout , but fail when trying is_trivially_copyable , is_constructibleis_default_constructible ,也许更多。错误消息是 'xxx' is not a member of 'std'

这里有什么问题?他们甚至被当前的 GCC 支持吗?谢谢!

原文由 user3156285 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

其中一些没有实施。如果我们查看 libstdc++ 的 c++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_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

原文由 Bill Lynch 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如其他人所提到的,GCC 版本 < 5 不支持来自 C++11 标准的 std::is_trivially_copyable

这是一个解决此限制的技巧:

 // 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

对于常见情况,这种 hack 可能足以让您的代码正常工作。但是,请注意 GCC 的 __has_trivial_copystd::is_trivially_copyable 之间的 细微差别。欢迎提出改进建议。

原文由 Kipton Barros 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题