【问题标题】:What is the difference between is_trivially_copyable and is_trivially_copy_constructible?is_trivially_copyable 和 is_trivially_copy_constructible 有什么区别?
【发布时间】:2013-05-08 16:21:32
【问题描述】:

这些何时会给出不同的答案,这种差异何时有用(如果有的话)?

【问题讨论】:

    标签: c++ c++11 typetraits


    【解决方案1】:

    前一个测试trivially copyable属性,简而言之就是类型是memcpy-safe。

    一般可复制的类是这样的类:

    ——没有重要的复制构造函数(12.8),

    ——没有重要的移动构造函数(12.8),

    ——没有非平凡的复制赋值运算符(13.5.3、12.8),

    ——没有非平凡的移动赋值运算符(13.5.3、12.8),并且

    ——有一个简单的析构函数(12.4)。

    普通类是具有普通默认构造函数 (12.1) 且可轻松复制的类。

    [ 注意: 特别是,平凡可复制或平凡的类没有虚函数 或虚拟基类。—结束说明 ]

    后者测试普通复制构造函数的存在,顺便说一句,这是普通可复制属性的要求。它基本上意味着该类型的复制构造函数执行按位复制。

    类 X 的复制/移动构造函数是微不足道的,如果它不是用户提供的并且如果

    ——X 类没有虚函数 (10.3) 和虚基类 (10.1),并且

    ——选择复制/移动每个直接基类子对象的构造函数是微不足道的,并且

    ——对于 X 的每个类类型(或其数组)的非静态数据成员,构造函数 选择复制/移动该成员是微不足道的;

    否则复制/移动构造函数是不平凡的。

    为这些特征提供不同结果的类型很容易制造:

    struct foo {
        foo(foo const&) = default; // this is a trivial copy constructor
        ~foo(); // this is a non-trivial destructor
    };
    

    【讨论】:

    • @Dave 没有。所以希望我用 15 个字符这么说。
    • 您可以在我关于PODs in C++11的综合回答中找到有关这些属性的更多信息。
    • 我认为看看这两个特征何时给出不同结果的例子会很有趣——就像问题要求的那样——更直接地说明差异。你能想到任何例子吗?
    • @Dave 查看列出的要求,可以看出它只是列表中的第一个要求,因此是众多要求之一。
    • @ChristianRau 在他编辑添加这些列表之前我发表了评论。
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多