我有一個非靜態的常量方法,稱爲size_t A::m() const
,我想用它來觸發一個斷點,如果它返回一個大於1的值。這裏是class A
和實例a
:條件斷點:這個表達式有副作用,將不會被評估
class A
{
public:
std::vector<double> myvec;
size_t m() const
{
return myvec.size();
}
} a;
所以我在Visual Studio 2013中添加斷點與此條件
a.m() > 1 // a is an instance of class A
然而,當我嘗試編譯這個我從IDE收到以下消息:
以下斷點不能設置:
在MYFILE.CPP,線XXX,當 'A.M()> 1' 爲真
該表達有副作用,不會進行評估。
注意A::m()
不修改任何東西,它只是調用矢量的.size()
方法,並返回值,使得表達有副作用的說法是完全錯誤的。實際上,代替斷點條件與a.myvec.size() > 1
(即方法本身的內容)具有相同的效果!
關於什麼可以用作斷點中的條件,Microsoft says that;
該條件可以是由 調試器識別的任何有效表達式。
於是我就和Expressions in the Debugger一看,和found this:副作用
一個常見原因是評估在 調試器窗口函數調用。這種評估通常是顯而易見的。更多的副作用的細微原因是對託管代碼中的屬性和其他 隱式函數調用的評估。
調試器無法判斷屬性評估或隱式函數調用是否有副作用。因此,默認情況下,調試器 不會自動評估隱式函數調用。屬性 默認情況下允許評估,但可以在選項 對話框中關閉。當函數調用或屬性尚未評估時,會出現一個 刷新圖標。您可以通過點擊刷新圖標 手動評估表達式。有關詳細信息,請參閱如何:刷新觀察值 值。
當關閉屬性或隱式函數調用的評估時,您可以使用ac格式修改器(僅適用於C# )強制執行評估。請參閱Format Specifiers in C#.
如果有人可以將上面的段落翻譯成英文,那將會很棒。我可以將函數放在這些調試器條件中嗎?
'a'的類型是什麼? –
@dauphic我已經添加了整個類和實例的定義 – arman
'a'不是一個指針,並且不會重載操作符' - >'。 –