视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
visual std::vector without exceptions: warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
我正在尝试将一个可移动的、不可复制的对象插入到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
来指示移动构造函数永远不会失败。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- OpenGL在启用深度测试时不会丢弃我的碎片
- Visual C++GC接口如何启用它以及要包含哪个库
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 如何在自定义类中启用'auto loops'?
- 根据某个函数是否存在启用模板
- 在C++17中,引用const字符串的语义应该是什么
- Xcode 语义问题引用或以前定义的代码
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 启用从"vector<const T>&"到"const vector&"的隐式转换<T>
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 使用移动和复制语义时函数匹配如何工作?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 移动语义和深层/浅层复制之间有什么关系?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc