我试图把我的头缠在隐式声明的副本构造函数的怪异特性上。请看下面的例子。一旦用户实现了自定义析构函数,复制构造函数就不再是琐碎的事了,但仍会生成。
icudt58l.dat
在线版本:https://godbolt.org/z/t-8_W3
我对琐碎的构造函数的理解是它们是由编译器生成的。但是,cppreference指出:
隐式定义的副本构造函数的生成是 如果T具有用户定义的析构函数或用户定义的副本,则不推荐使用 赋值运算符。
因此,似乎可以隐式声明构造函数可以处于另外一种状态,即“已弃用”。它不是“琐碎的”并且不是用户实现的,而是仍然由您的编译器生成的。有人知道类型特征或变通方法来验证构造函数是否“不赞成使用”吗?
答案 0 :(得分:4)
is_trivially_copy_constructible<T>
还要求T
不可破坏。该特征检查的是假设变量定义是否为
T t(declval<T const&>());
不会调用任何非平凡的操作。但是test
并非微不足道的破坏力,这种破坏是隐含的。
如果将~test() { }
更改为~test() = default
,则断言将不再触发。
关于弃用隐式定义的构造函数的注意事项是不相关的,因为您具有显式默认的副本构造函数。