gpt4 book ai didi

c++ - 重载运算符不抛出异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:29 24 4
gpt4 key购买 nike

我有一个包含 map 的类

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 ");
}
}

我希望它在映射中不存在该字段时抛出异常,这样程序就不会在错误获取时崩溃,但抛出似乎对重载运算符不起作用,程序还是会崩溃,所以要么throw 或 catch 被忽略。如果我使用相同的代码但具有共同的功能

Any& Map::get( const unsigned int field ) const
{
//...

有效。

我是遇到了某些 C++ 限制还是做错了什么?

--编辑:

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

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;
}

崩溃的发生是因为 Any 上的 boost 断言试图转换未初始化的变量。此方法可能用于 map 上的插入,例如

Map a;
a[3] = "foo";

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

最佳答案

重新编辑:重载决议通常只考虑参数,而不是使用。如果你有一个 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 );
}
};

关于c++ - 重载运算符不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9566937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com