弃用的隐式声明的副本构造函数

时间:2018-09-27 19:25:39

标签: c++ c++11 c++17 typetraits static-assert

我试图把我的头缠在隐式声明的副本构造函数的怪异特性上。请看下面的例子。一旦用户实现了自定义析构函数,复制构造函数就不再是琐碎的事了,但仍会生成。

icudt58l.dat

在线版本:https://godbolt.org/z/t-8_W3

我对琐碎的构造函数的理解是它们是由编译器生成的。但是,cppreference指出:

  

隐式定义的副本构造函数的生成是   如果T具有用户定义的析构函数或用户定义的副本,则不推荐使用   赋值运算符。

因此,似乎可以隐式声明构造函数可以处于另外一种状态,即“已弃用”。它不是“琐碎的”并且不是用户实现的,而是仍然由您的编译器生成的。有人知道类型特征或变通方法来验证构造函数是否“不赞成使用”吗?

1 个答案:

答案 0 :(得分:4)

is_trivially_copy_constructible<T>还要求T不可破坏。该特征检查的是假设变量定义是否为

T t(declval<T const&>());

不会调用任何非平凡的操作。但是test并非微不足道的破坏力,这种破坏是隐含的。

如果将~test() { }更改为~test() = default,则断言将不再触发。


关于弃用隐式定义的构造函数的注意事项是不相关的,因为您具有显式默认的副本构造函数。