Mic*_*ens 7 c++ c++11 trivially-copyable
除了非平凡的析构函数之外,所有特殊函数都默认的类不是可简单移动或复制构造的。有关示例,请参见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, "");
Run Code Online (Sandbox Code Playgroud)
GCC 和 Clang 都没有通过相应的断言,而 ICC 通过。奇怪的是,分配没有受到影响,尽管我可以理解分配给的对象需要被销毁。但反过来说似乎是对的。为什么?为什么ICC不同意?
我看到评论已经提到了。答案位于此处的注释部分https://en.cppreference.com/w/cpp/types/is_copy_constructible:
同样适用于
is_trivially_copy_constructible,在这些实现中,它还要求析构函数是简单的:GCC bug 51452 LWG issues 2116。