已弃用隐式声明的复制构造函数
Deprecated implicitely-declared copy constructor
我试图围绕隐式声明的复制构造函数的一个奇怪特征来思考。举个例子。一旦用户实现了自定义析构函数,复制构造函数就不再是简单的,而是仍然会生成。
#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("%dn", t2.i);
return 0;
}
在线版 : https://godbolt.org/z/t-8_W3
我对琐碎构造函数的理解是它们是由编译器生成的。但是,cpp首选项指出:
隐式定义的复制构造函数的生成为 如果 T 具有用户定义的析构函数或用户定义的副本,则不推荐使用 赋值运算符。
因此,隐式声明的构造函数似乎还有一种状态,即"弃用"。它不是"微不足道的",也不是用户实现的,但仍然由您的编译器生成......这是对的吗?是否有人知道类型特征或解决方法来验证构造函数是否"已弃用"?
is_trivially_copy_constructible<T>
还要求T
是微不足道的可破坏的。这个特征检查的是假设变量定义是否:
T t(declval<T const&>());
不会调用任何非平凡的操作。但test
不是微不足道的可破坏的,这种破坏隐含在这种结构中。
如果将~test() { }
更改为~test() = default
,断言将不再触发。
关于弃用隐式定义的构造函数的说明无关紧要,因为您有一个显式默认的复制构造函数。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用