重载运算符不会抛出异常

ibr*_*ker 5 c++ exception operator-overloading

我有一个包含地图的类

Any& Map::operator[]( const unsigned int field ) const
{
  try
  {
    iterator it;
    if ((it = m_fields.find(field)) != m_fields.end())
      return it->second;

    throw std::runtime_error("Field " + boost::lexical_cast<std::string>(field) + " not found.");
  }
  catch(boost::bad_any_cast& )
  {
    throw std::runtime_error("Failed conversion field " + boost::lexical_cast<std::string>(field)  + " using boost::any_cast ");
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望它在地图不存在于地图中时抛出异常,因此程序不会在错误的get上崩溃,但是throw似乎对重载的运算符不起作用,程序无论如何都会崩溃所以无论是throw还是捕获被忽略了.如果我使用相同的代码但具有通用功能

Any& Map::get( const unsigned int field ) const
{
  //...
Run Code Online (Sandbox Code Playgroud)

有用.

我运行了一些c ++限制还是我做错了什么?

--EDIT:

我运行了调试器,令我惊讶的是代码甚至没有执行,另一种方法也是如此

Any& Map::operator[]( const unsigned int  field )
{
  iterator it;
  if ((it = m_fields.find(field)) == m_fields.end())
  {
    Any newValue;
    m_fields[field] = newValue;
    return m_fields[field];
  }

  return it->second;
}
Run Code Online (Sandbox Code Playgroud)

并且由于尝试转换未初始化变量的Any上的提升断言而发生崩溃.此方法可能用于地图上的插入,如

Map a;
a[3] = "foo";
Run Code Online (Sandbox Code Playgroud)

所以我想我无法区分何时将运算符用于归因或获取并且使用此运算符对于获取非常不安全

Jam*_*nze 2

重新编辑:重载解析通常只考虑参数,而不考虑使用。如果您有一个 const 和一个非常量函数,并且具有相同的签名,则如果可能,将选择非常量(例如,在非常量对象上调用)。

如果您确实希望根据用途实现不同的行为,传统的解决方案是提供代理。您的Map类将包含两个函数getset,非常量operator[]将返回一个代理,如下所示:

class Proxy  // member of Map
{
    Map* myOwner;
    int myIndex;
public:
    Proxy( Map* owner, int index )
        : myOwner( owner )
        , myIndex( index )
    {
    }
    void operator=( Any const& rhs ) const
    {
        myOwner->put( myIndex, rhs );
    }
    operator Any() const
    {
        return myOwner->get( myIndex );
    }
};
Run Code Online (Sandbox Code Playgroud)