gpt4 book ai didi

c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false)

转载 作者:可可西里 更新时间:2023-11-01 18:15:53 26 4
gpt4 key购买 nike

无论我在互联网上的什么地方阅读,强烈建议如果我希望我的类(class)与 std::vector 一起工作(即 std 使用我类(class)的 move 语义::vector) 我应该将构造函数 delcare move 为 '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

最佳答案

你没有做错。

您只是错误地认为 push_back 必须避免抛出 move-ctor:它不会,至少对于构造新元素而言。

必须避免抛出 move-ctors/move-assignments 的唯一地方是重新分配 vector,以避免 move 了一半的元素,而其余的元素还在原来的位置。

该函数具有强大的异常安全保证:

要么操作成功,要么失败并且什么都没有改变。

关于c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26224112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com