首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么同时拥有默认析构函数和向量成员可以防止类是“不可抛出的可移动构造的”?

为什么同时拥有默认析构函数和向量成员可以防止类是“不可抛出的可移动构造的”?
EN

Stack Overflow用户
提问于 2022-02-15 15:55:16
回答 2查看 66关注 0票数 2

考虑到以下代码:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <type_traits>

class Test {
public:
    ~Test() = default;
    std::vector<int> m_vector;
};


int main() {
    std::cout << std::is_nothrow_move_constructible_v<Test> << std::endl;
    return 0;
}

它输出0,这意味着Test类不能“不抛出移动”。但是,如果删除~Test()m_vector,则返回1

请给我解释一下。

作为参考,我在C++17中使用了clang++-7。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-15 16:08:05

请参阅[class.copy.ctor]/8

如果类X的定义没有显式声明移动构造函数,则只有在忽略其他条件时,才会隐式声明非显式构造函数,并且X没有用户声明的析构函数。

因此,Test类只有一个复制构造函数,而不是一个移动构造函数。任何使用Test rvalue初始化新Test对象的代码都将使用复制构造函数,因为向量成员不是noexcept。如果移除向量成员,则Test的复制构造函数将变得非常简单。

票数 6
EN

Stack Overflow用户

发布于 2022-02-15 16:09:11

定义用户声明的析构函数时,该类将不具有隐式生成的移动构造函数。因此,移动将调用复制构造函数。std::vector的复制构造函数可能会抛出,因此Test的隐式复制构造函数也可能抛出。

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

https://stackoverflow.com/questions/71129489

复制
相关文章

相似问题

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