代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Zato

STD::无例外的向量:警告C430:C++异常处理程序,但未启用语义。指定/EHsc

  •  1
  • TomáÅ¡ Zato  · 技术社区  · 5 年前

    我正在尝试将一个可移动的、不可复制的对象插入到 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

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

    我不知道该怎么做,除了放弃不复制规则或启用例外。我会启用例外,但如果我不能,我还能做什么?

    为什么会这样 push_back

    1 回复  |  直到 5 年前
        1
  •  3
  •   Marshall Clow    5 年前

    为什么会这样 push_back

    vector::push_back

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

    noexcept .