【发布时间】:2018-09-27 19:25:39
【问题描述】:
我正试图围绕隐式声明的复制构造函数的一个奇怪特征。举个例子。一旦用户实现了自定义析构函数,复制构造函数就不再是微不足道的了,但仍然会生成。
#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 具有用户定义的析构函数或用户定义的副本,则不推荐使用 赋值运算符。
因此,隐式声明的构造函数似乎还有另一种状态,即“已弃用”。它不是“微不足道的”,也不是用户实现的,但仍然由您的编译器生成……对吗?有人知道用于验证构造函数是否“已弃用”的类型特征或解决方法吗?
【问题讨论】:
-
"deprecated" 表示它仍然会发生,但不鼓励您的程序依赖它,并且可能会在未来的标准中删除
标签: c++ c++11 c++17 typetraits static-assert