8

除了非平凡的析构函数之外,所有特殊功能都默认的类不是平凡的移动或复制构造。有关示例,请参见https://godbolt.org/z/o83rPz :

#include <type_traits>

class Sample
{
public:
        Sample(Sample const&) = default;
        Sample(Sample&&) = default;
        Sample& operator=(Sample const&) = default;
        Sample& operator=(Sample&&) = default;
        ~Sample() {}
};

static_assert(std::is_copy_constructible<Sample>::value, "");
static_assert(std::is_move_constructible<Sample>::value, "");
static_assert(std::is_trivially_copy_constructible<Sample>::value, ""); // Fails with GCC and Clang
static_assert(std::is_trivially_move_constructible<Sample>::value, ""); // Fails with GCC and Clang
static_assert(std::is_copy_assignable<Sample>::value, "");
static_assert(std::is_move_assignable<Sample>::value, "");
static_assert(std::is_trivially_copy_assignable<Sample>::value, "");
static_assert(std::is_trivially_move_assignable<Sample>::value, "");

GCC 和 Clang 都失败了相应的断言,而 ICC 通过了。奇怪的是,分配不受影响,尽管我可以理解分配对象需要被销毁。但反过来似乎是对的。为什么?为什么ICC不同意?

4

1 回答 1

0

我看到评论已经提到了它。答案在https://en.cppreference.com/w/cpp/types/is_copy_constructible的注释部分:

同样适用于is_trivially_copy_constructible,在这些实现中,也要求析构函数是微不足道的:GCC bug 51452 LWG issue 2116

于 2021-10-09T18:22:10.670 回答