c++ - 它是什麼意思“由於函數調用,謂詞不應該修改它們的狀態”?




c++11 stl (3)

我正在網上閱讀關於C ++的內容並且發現了這個聲明:

由於函數調用,謂詞不應修改其狀態。

我不明白“狀態”在這裡意味著什麼。 有人可以詳細說明一個例子嗎?


在外行人看來,謂詞中的 狀態 是數據成員。 更改狀態的謂詞意味著在算法執行期間成員獲得更改,並且該更改將影響謂詞行為。

避免這種情況的原因是算法沒有義務保留謂詞的單個實例。 它們可能很容易被複製,並且狀態在一個副本中更改,不會與另一個副本中的狀態共享。 結果,程序將出乎意料地行為(對於期望狀態改變生效的人)。


基本上什麼標准說謂詞應該像純函數一樣(在數學術語中),即它的返回值應該僅依賴於輸入。

提到狀態是因為謂詞可以被複製或者可以在不同的線程中調用,這取決於實現和平台行為。 對於lambda和其他非函數的可調用對象,這可能意味著對存儲的無序訪問,通過引用捕獲,或者如果它們是按值捕獲的,則訪問不同的值。 對於函數,這意味著任何副作用(包括靜態變量的更改)都可能導致問題。

如果排序的謂詞將為同一對返回不同的結果,則某些排序算法將變為無效。


除了其他答案之外,許多采用謂詞的算法都不承諾任何特定的遍歷順序( ExecutionPolicy 重載允許交錯遍歷)。 您可能會對同一個問題得到不同的答案。

如果有多個線程調用 1 謂詞並且它改變了一些共享值,那就是 數據競爭 ,即未定義的行為。

  1. 或一個線程交錯調用




predicate