我正在试图理解隐式声明的复制构造函数的奇怪特征。请看下面的例子。一旦用户实现了自定义析构函数,复制构造函数就不再是微不足道的了,但仍然是生成的。
#include <type_traits>
#include <cstdio>
struct test {
test() = default;
~test() {
}
test(const test&) = default;
int i{42};
};
static_assert(std::is_copy_constructible_v<test>, "werks"); // OK
static_assert(std::is_trivially_copy_constructible_v<test>, "sad"); // FAILS
int main() {
test t;
test t2(t);
printf("%d\n", t2.i);
return 0;
}
在线版本:https://godbolt.org/z/t-8_W3
我对简单构造函数的理解是它们是由编译器生成的。然而,cppreference指出:
如果T具有用户定义的析构函数或用户定义的复制赋值运算符,则不推荐生成隐式定义的复制构造函数。
因此,看起来隐式声明的构造函数还可以处于另一种状态,即“弃用”状态。它不是“琐碎的”,也不是用户实现的,但仍然是由你的编译器生成的……对吗?是否有人知道类型特征或解决方法来验证构造函数是否“不推荐使用”?
发布于 2018-09-28 03:33:54
is_trivially_copy_constructible<T>
还要求T
是可销毁的。这个特征检查的是假设的变量定义:
T t(declval<T const&>());
但是test
不是微不足道的可破坏的,并且这种破坏是隐含在该构造中的。
如果将~test() { }
更改为~test() = default
,则断言将不再触发。
关于不推荐使用隐式定义的构造函数的说明是不相关的,因为您有一个显式默认的复制构造函数。
https://stackoverflow.com/questions/52543851
复制相似问题