【问题标题】:‘is_trivially_copyable’ is not a member of ‘std’“is_trivially_copyable”不是“std”的成员
【发布时间】:2014-08-04 16:37:56
【问题描述】:

我的 gcc 版本是 4.8.3 20140624。我可以使用is_podis_trivialis_standard_layout,但在尝试is_trivially_copyableis_constructibleis_default_constructible 时失败了,也许更多。错误信息是'xxx' is not a member of 'std'

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

【问题讨论】:

    标签: c++ c++11 typetraits


    【解决方案1】:

    正如其他人提到的,GCC 版本 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 之间的 subtle differences。欢迎提出改进建议。

    【讨论】:

      【解决方案2】:

      其中一些没有实现。如果我们看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
      

      【讨论】:

      • @JonathanWakely 我稍微改变了措辞。如果您有 4.8.3 的列表(或者您知道它没有更改),请随时与他们一起修复此答案。否则,我将保留 4.9.1 的文档列表。
      • 4.8.3 的列表是 gcc.gnu.org/onlinedocs/gcc-4.8.3/libstdc++/manual/manual/… 并且该表中缺少的特征是准确的,但该表的其余部分可能不如该表的最新版本准确......我'我不确定我什么时候经历过并试图完成它。您最初链接到的列表是针对 subversion 主干的,不是 4.9.1,它位于gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/manual/manual/…
      【解决方案3】:

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

      std::has_trivial_copy_constructor<int>::value
      

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

      Live example

      【讨论】:

      • 成为TriviallyCopyable 不需要简单的复制构造函数。
      • 我通常不会投反对票,但这些信息可能会导致混乱。如果您对其进行编辑,我将删除反对票。
      • @GermánDiago 我希望对答案进行了足够的改进,如果您仍然认为某些内容缺失/错误,请随时进行编辑。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        确实,GCC 的 C++ 2011 实现似乎不支持“is_trivially_copyable”。见point 20.9.4.3 of the status

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

        【讨论】:

        • 这是 c++ 标准库的属性,而不是编译器。所以 libstdc++ vs libc++,而不是 gcc vs clang。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多