无法在监视窗口中使用重载运算符评估表达式

Posted

技术标签:

【中文标题】无法在监视窗口中使用重载运算符评估表达式【英文标题】:Unable to evaluate expressions with overloaded operator in Watch window 【发布时间】:2013-10-18 22:01:33 【问题描述】:

我在这里看到了几个与此问题相关的问题。但他们似乎都在讨论解决这个问题的一些 STL 特定技巧。 这是问题的一个简单示例。假设我们使用一个类,它重载了某个运算符,比如 std::vector 重载 [] 运算符:

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

auto x = v[0];

当试图评估调用重载运算符的表达式时,在这种情况下为v[0],VC++ 在Watch Window 中显示以下错误:

v[0] no operator "[]" matches these operands    

我的第一个猜测是调试器无法确定参数的类型,所以我尝试评估 v[(size_type)0] 表达式,然后对 ((intvector)v)[(size_type)0] 表达式进行以下修改:

typedef vector<int> intvector;
intvector v;

运气不好。我又收到了同样的错误信息。

这很奇怪,因为当我使用运算符调用的扩展形式(不确定此处是否正确)时,它可以工作:v.operator[](0)。而且它似乎普遍适用,不仅适用于 STL 类,而且适用于我自己的重载 [] 运算符的类。

在我的理解中v[0]v.operator[](0) 这两种形式应该是等价的,但是VC++ 似乎有不同的想法。他们真的不一样吗?为什么 VC++ 调试器不能评估短形式,但对“扩展”形式没有问题?有没有办法解决?我很习惯只复制一小段代码并在Watch Window 中对其进行评估。

【问题讨论】:

【参考方案1】:

如果有可用的const 和非const 版本,Visual Studio 的调试器表达式不支持重载运算符。看到这个page on MSDN。

调试器不支持 const 和非 const 版本的重载运算符。标准模板库中经常使用具有 const 和非 const 版本的重载运算符。

【讨论】:

即使类中只有一个非const 版本,VS 也无法显示它。同时它适用于实现const 和非const 运算符的类,但是当使用operator 关键字将运算符作为函数调用时。这就是问题的重点。

以上是关于无法在监视窗口中使用重载运算符评估表达式的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Perl 中重载正则表达式绑定运算符 `=~`?

在 sympy 中,如何将函数表达式转换为运算符重载表达式?

Python——运算符重载

运算符重载

无法在 F# 中重载布尔运算符

Python面向对象之运算符重载