- C++11中 内存释放函数 和 析构函数 都是隐式noexcept,除非手动声明noexcept(flase),但如果是一个对象的析构函数可能被标准库使用,且析构函数有可能抛出异常,那么程序的行为是未定义的
- std::vector添加新元素如果容量不够,那么vector会分配更大的内存用于存储元素,并且之前vector中的数据会被复制或者移动到新的位置,但是如果移动操作不是noexcept,那么vector是不敢用移动操作的
移动构造函数未定义为 no-except
#include <vector>
#include <string>
#include <array>
#include <iostream>struct A
{A(std::string param){std::cout << "A(std::string param)" << std::endl;_data = param;}A(const A &a){std::cout << "A(const A& a)" << std::endl;_data = a._data;}A(A &&a) //noexcept // 不声明,就会调用拷贝操作{std::cout << "A(A&& a)" << std::endl;_data = std::move(a._data);}public:std::string _data;
};int main()
{std::vector<A> a_vec;a_vec.reserve(2);a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));int a[10] = {0};int b[10] = {1};std::swap(a, b);return 0;
}
A(std::string param)
A(A&& a)
A(std::string param)
A(A&& a)
A(std::string param)
A(A&& a)
A(const A& a)
A(const A& a)
A(std::string param)
A(A&& a)
移动构造函数定义为 no-except
#include <vector>
#include <string>
#include <array>
#include <iostream>struct A
{A(std::string param){std::cout << "A(std::string param)" << std::endl;_data = param;}A(const A &a){std::cout << "A(const A& a)" << std::endl;_data = a._data;}A(A &&a) noexcept // 不声明,就会调用拷贝操作{std::cout << "A(A&& a)" << std::endl;_data = std::move(a._data);}public:std::string _data;
};int main()
{std::vector<A> a_vec;a_vec.reserve(2);a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));a_vec.push_back(A("nihao"));// 标准库实现swap// template <class T, size_t N>// void swap(T (&a)[N],// T (&b)[N]) noexcept(noexcept(swap(*a, *b))); //见下文// 如果swap(*a, *b) 不抛异常 // -> noexcept(swap(*a, *b)=true // -> noexcept(noexcept(swap(*a, *b)))// -> noexcept// 如果swap(*a, *b) 抛异常 // -> noexcept(swap(*a, *b)=false // -> noexcept(noexcept(swap(*a, *b)))// -> noexcept(false)int a[10] = {0};int b[10] = {1};std::swap(a, b);return 0;
}
A(std::string param)
A(A&& a)
A(std::string param)
A(A&& a)
A(std::string param)
A(A&& a)
A(A&& a)
A(A&& a)
A(std::string param)
A(A&& a)