首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不推荐使用隐式声明的复制构造函数

不推荐使用隐式声明的复制构造函数
EN

Stack Overflow用户
提问于 2018-09-28 03:25:39
回答 1查看 2.6K关注 0票数 1

我正在试图理解隐式声明的复制构造函数的奇怪特征。请看下面的例子。一旦用户实现了自定义析构函数,复制构造函数就不再是微不足道的了,但仍然是生成的。

代码语言:javascript
复制
#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具有用户定义的析构函数或用户定义的复制赋值运算符,则不推荐生成隐式定义的复制构造函数。

因此,看起来隐式声明的构造函数还可以处于另一种状态,即“弃用”状态。它不是“琐碎的”,也不是用户实现的,但仍然是由你的编译器生成的……对吗?是否有人知道类型特征或解决方法来验证构造函数是否“不推荐使用”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 03:33:54

is_trivially_copy_constructible<T>还要求T是可销毁的。这个特征检查的是假设的变量定义:

代码语言:javascript
复制
T t(declval<T const&>());

但是test不是微不足道的可破坏的,并且这种破坏是隐含在该构造中的。

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

关于不推荐使用隐式定义的构造函数的说明是不相关的,因为您有一个显式默认的复制构造函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52543851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档