无论我在互联网上的何处阅读,强烈建议如果我希望我的类能够很好地工作std::vector
(即我的类中的移动语义被使用std::vector
),我应该将移动构造函数称为“noexcept”(或noexcept(true)
)。
std::vector
即使我将其标记noexcept(false)
为实验,为什么还要使用它?
#include <iostream>
#include <vector>
using std::cout;
struct T
{
T() { cout <<"T()\n"; }
T(const T&) { cout <<"T(const T&)\n"; }
T& operator= (const T&)
{ cout <<"T& operator= (const T&)\n"; return *this; }
~T() { cout << "~T()\n"; }
T& operator=(T&&) noexcept(false)
{ cout <<"T& operator=(T&&)\n"; return *this; }
T(T&&) noexcept(false)
{ cout << "T(T&&)\n"; }
};
int main()
{
std::vector<T> t_vec;
t_vec.push_back(T());
}
输出:
T()
T(T&&)
~T()
~T()
为什么 ?我做错了什么 ?
在 gcc 4.8.2 上编译,CXX_FLAGS 设置为:
--std=c++11 -O0 -fno-elide-constructors