c – std :: is_trivially_copyable错了吗?
作者:互联网
考虑到cppreference和当前的c工作草案,如果符合以下条件,则可以轻松复制一个类:
>每个复制构造函数都很简单或被删除
>每个移动构造函数都是微不足道的或删除的
>每个复制赋值运算符都很简单或被删除
>每个移动赋值运算符都很简单或被删除
>至少一个复制构造函数,移动构造函数,复制赋值运算符或移动赋值运算符未被删除
>琐碎的非删除析构函数
> http://en.cppreference.com/w/cpp/concept/TriviallyCopyable
> http://en.cppreference.com/w/cpp/types/is_trivially_copyable
> https://github.com/cplusplus/draft/blob/master/papers/n4750.pdf(第215页)
所以我想出了这个代码示例:
#include <type_traits>
struct non_trivially_copyable {
non_trivially_copyable(non_trivially_copyable const&) = delete;
non_trivially_copyable& operator=(non_trivially_copyable const&) = delete;
non_trivially_copyable(non_trivially_copyable &&) = delete;
non_trivially_copyable& operator=(non_trivially_copyable &&) = delete;
};
int main()
{
return std::is_trivially_copyable<non_trivially_copyable>::value;
}
我的班级不满足要求编号5.它仍然给我的结果是我的班级non_trivially_copyable是可以轻易复制的.我在一些在线编译器上测试了它:
> https://godbolt.org/g/9s4fr9
> https://wandbox.org/permlink/sEJYdi5aIDMzsjGY
> https://onlinegdb.com/SyFyTBrx7
> http://coliru.stacked-crooked.com/a/93b6ea4d202092a6
我怀疑所有的实现都是错误的;那为什么我得到这个结果呢?
解决方法:
这在C 17中有所改变;在此之前,non_trivially_copyable可以轻易地复制.你的课程在C 17中确实不是可以复制的,你所指的标准部分也是如此.
但是,似乎libstdc和libc没有更新以反映这一点.所以直接回答你的问题:这两个实现确实是错误的.
请注意,您的Godbolt链接显示MSVC确实正确.
由于这被认为是一个缺陷(见CWG 1734),这也应该改变C的旧版本的实现.
据我所知,标准变化的一个核心动机是围绕原子和互斥体进行记忆非法.
标签:c,c17,c-standard-library,typetraits 来源: https://codeday.me/bug/20190910/1799010.html