c++ - std::vector 无异常:警告 C4530:使用了 C++ 异常处理程序,但未启用展开语义。指定/EHsc

标签 c++ visual-c++ c++17 stdvector

我正在尝试将可移动、不可复制的对象插入 std::vector 。我将原始代码简化为这个示例:

#include <vector>
class MovingClass
{
public:
  MovingClass(const int value) : _value(new int(value)) {}
  //! No copy allowed
  MovingClass(const MovingClass& src) = delete;
  MovingClass& operator=(const MovingClass& src) = delete;
  // move is OK
  MovingClass(MovingClass&& source) : _value(source._value) { source._value = nullptr; }
  MovingClass& operator=(MovingClass&& source) { _value = source._value; source._value = nullptr; }

  ~MovingClass() { delete _value; }
  // do not mind that this is all kinds of bad, it's just an example
  int* _value;
};

int test_vector_main()
{
  std::vector<MovingClass> containers;
  containers.push_back({ 42 });

  return 0;
}

该类的最初目的是关闭 winapi 句柄,而不是删除指针。

如果我在 Configuration Properties->C/C++->All Options 中将“启用 C++ 异常”设置为“否”,我可以在空白项目中重现该警告。 .

我参与的项目将警告视为错误并禁用了异常。

除了放弃禁止复制规则或启用异常(exception)之外,我不知道该怎么办。我将启用异常(exception),但如果我不能,我还能做什么?

为什么push_back甚至需要异常(exception)?

最佳答案

Why does push_back even require exceptions?

vector::push_back 必须做两件事:

  • 确保有空间容纳新元素。这可能涉及分配内存——这可能会失败。它通过抛出异常来报告此失败。
  • 在 vector 中构造一个新元素。这涉及到调用类的复制或移动构造函数 - 这可能会失败。构造函数通常通过抛出异常来报告失败。

您可以通过将其标记为 noexcept 来指示您的移动构造函数永远不会失败。

关于c++ - std::vector 无异常:警告 C4530:使用了 C++ 异常处理程序,但未启用展开语义。指定/EHsc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57891442/

相关文章:

c++ - 您是否应该能够从 T 具有非平凡构造函数的 std::optional<T> 移动?

c++ - auto 带括号和初始化列表

c++ - 大阶乘系列

c++ - 变体和 _bstr_t 之间的转换导致 Windows 2008 中的不一致崩溃

c++ - 使用管道从子进程重定向 I/O - winapi

c++ - 链接问题与定义为静态的存储类

c++ - 正则表达式慢

c++ - 为流运算符返回代理类时解包参数

c++ - 检查迭代器的最后一个元素

c++ - 宏编译错误