考虑到以下代码:
#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。
发布于 2022-02-15 16:08:05
请参阅[class.copy.ctor]/8
如果类
X的定义没有显式声明移动构造函数,则只有在忽略其他条件时,才会隐式声明非显式构造函数,并且X没有用户声明的析构函数。
因此,Test类只有一个复制构造函数,而不是一个移动构造函数。任何使用Test rvalue初始化新Test对象的代码都将使用复制构造函数,因为向量成员不是noexcept。如果移除向量成员,则Test的复制构造函数将变得非常简单。
发布于 2022-02-15 16:09:11
定义用户声明的析构函数时,该类将不具有隐式生成的移动构造函数。因此,移动将调用复制构造函数。std::vector的复制构造函数可能会抛出,因此Test的隐式复制构造函数也可能抛出。
https://stackoverflow.com/questions/71129489
复制相似问题