视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc

visual std::vector without exceptions: warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc

本文关键字:启用 语义 EHsc 指定 异常处理程序 std 异常 警告 视觉 C4530 C++      更新时间:2023-10-16

我正在尝试将一个可移动的、不可复制的对象插入到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 句柄,而不是删除指针。

如果我在空白项目中将"启用C++例外"设置为"否",我可以在空白项目中重现警告Configuration Properties->C/C++->All Options.

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

除了放弃无复制规则或启用例外之外,我不确定该怎么办。我将启用例外,但如果不能,我还能做什么?

为什么push_back甚至需要例外?

为什么push_back甚至需要例外?

vector::push_back必须做两件事:

  • 确保新元素有空间。这可能涉及分配内存 - 这可能会失败。它通过引发异常来报告此失败。
  • 在向量中构造一个新元素。这涉及调用类的 copy 或 move 构造函数 - 这可能会失败。构造函数通常通过引发异常来报告失败。

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